当前位置: 首页 > news >正文

【小沐学OpenGL】Ubuntu环境下glut的安装和使用

文章目录

  • 1、简介
    • 1.1 OpenGL简介
    • 1.2 glut简介
    • 1.3 freeglut
  • 2、glut安装
    • 2.1 命令安装glut
    • 2.2 源码安装glut
  • 3、glut测试
    • 3.1 测试1,版本打印
    • 3.2 测试2,绘制三角形
    • 3.3 测试3,VBO绘制三角形
  • 结语

1、简介

1.1 OpenGL简介

OpenGL作为图形界的工业标准,其仅仅定义了一组2D和3D图形接口API,而对于窗口管理、IO消息响应等并没有规定。也就是说,OpenGL依赖各平台提供用于渲染的context以及具体实现方式,而各平台提供的实现不尽相同。这些实现主要有:Windows平台下的WGL、Linux下的Mesa/GLX、Mac OS X下的Cocoa/NSGL,以及跨平台的GLUT、GLFW、SDL等等。
在这里插入图片描述

安装OpenGL库:

# sudo apt-get install build-essential libxmu-dev libxi-dev libgl-dev
sudo apt-get install build-essential
sudo apt-get install libgl1-mesa-dev
sudo apt-get install libglu1-mesa-dev

在这里插入图片描述

使用如下的命令来查看对应显卡的OpenGL版本:

glxinfo | grep -i opengl

在这里插入图片描述

1.2 glut简介

https://www.opengl.org/resources/libraries/glut/glut_downloads.php

http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip

https://www.opengl.org/resources/libraries/glut/glut-3.spec.pdf

OpenGL工具库 OpenGL Utility Toolkit,包含大约30多个函数,函数名前缀为glut。

glut是不依赖于窗口平台的OpenGL工具包,由Mark KLilgrad在SGI编写(现在在Nvidia),目的是隐藏不同窗口平台API的复杂度。 函数以glut开头,它们作为aux库功能更强的替代品,提供更为复杂的绘制功能,此函数由glut.dll来负责解释执行。由于glut中的窗口管理函数是不依赖于运行环境的,因此OpenGL中的工具库可以在X-Window, Windows NT, OS/2等系统下运行,特别适合于开发不需要复杂界面的OpenGL示例程序。对于有经验的程序员来说,一般先用glut理顺3D图形代码,然后再集成为完整的应用程序。
在这里插入图片描述

1.3 freeglut

https://freeglut.sourceforge.net/
https://github.com/freeglut/freeglut/releases
freeglut最初由帕维尔·W. Olszta与安德烈亚斯·乌姆巴赫和史蒂夫·贝克的贡献。史蒂夫是现在官方的拥有者/维护者。帕维尔在1999年12月1日开始freeglut的开发。目前,该项目几乎可以100%的替代原来的GLUT,只有少数差别(如the abandonment of SGI-specific features,按钮盒子和动态视频分辨率)和 其他一小部分程序Bug。

这个库是原始的GLUT库修改之后得到的,它既提供32位、也提供64位的编译环境。
在这里插入图片描述
在这里插入图片描述

2、glut安装

2.1 命令安装glut

# sudo apt-get install build-essential freeglut3 freeglut3-dev
# sudo apt-get install libglut-dev or 
sudo apt-get install freeglut3-dev

在这里插入图片描述

locate freeglut

在这里插入图片描述

sudo apt-get remove freeglut3
# or
sudo apt-get -y autoremove freeglut3
# or
sudo apt-get -y purge freeglut3
# or
sudo apt-get -y autoremove --purge freeglut3

在这里插入图片描述
在卸载freeglut库之后,编译测试项目如下:
在这里插入图片描述

2.2 源码安装glut

  • (1)glut
    如果安装 GLUT,地址在:https://user.xmission.com/~nate/glut.html,下载 glut-3.7.6-bin.zip(已经十几年没更新过了所以就是这个版本了)
    https://user.xmission.com/~nate/glut/glut-3.7.6-bin.zip
  • (2)freeglut
    freeglut 在地址:https://github.com/freeglut/freeglut/releases/download/v3.6.0/freeglut-3.6.0.tar.gz

3、glut测试

3.1 测试1,版本打印

  • CMakeLists.txt
cmake_minimum_required(VERSION 2.8.1)project(my_project)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 14)# seach
find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)# include
include_directories(${OPENGL_INCLUDE_DIRS})
include_directories(${GLUT_INCLUDE_DIRS})add_executable(${PROJECT_NAME} main.cpp)target_link_libraries(${PROJECT_NAME} ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES})
  • main.cpp

#include <iostream>
#include <GL/freeglut.h>int main(int argc, char** argv)
{std::cout << "hello, yxy" << std::endl;glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(300, 300);glutInitWindowPosition(100, 100);glutCreateWindow("OpenGL Version");const GLubyte* szVendor = glGetString(GL_VENDOR);const GLubyte* szRender = glGetString(GL_RENDERER);const GLubyte* szGLVersion = glGetString(GL_VERSION);const GLubyte* szGluVersion = gluGetString(GLU_VERSION);printf("OpenGL实现厂商的名字:%s\n", szVendor);printf("OpenGL渲染器标识符:%s\n", szRender);printf("OpenGL实现的版本号:%s\n", szGLVersion);printf("GLU工具库版本:%s\n", szGluVersion);return 0;
}

编译如下:
在这里插入图片描述
或者直接使用gcc编译

gcc -o test main.c -lGL -lGLU -lglut
# or
apt-get install libglew-dev
g++ -o test main.cpp -lGL -lGLU -lglut -lGLEW

3.2 测试2,绘制三角形

  • main.cpp
#include <GL/freeglut.h>void renderScene(void)
{glClearColor(1.0, 1.0, 0.6, 1.0);glClear(GL_COLOR_BUFFER_BIT);glLoadIdentity();glBegin(GL_TRIANGLES);glColor3f(1, 0, 0);glVertex3f(-0.5, -0.5, 0.0);glColor3f(0, 1, 0);glVertex3f(0.5, 0.0, 0.0);glColor3f(0, 0, 1);glVertex3f(0.0, 0.5, 0.0);glEnd();glutSwapBuffers();
}int main(int argc, char** argv)
{glutInit(&argc, (char**)argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);glutInitWindowPosition(100, 100);glutInitWindowSize(800, 480);glutCreateWindow("yxy glut: draw triangle");glutDisplayFunc(renderScene);glutMainLoop();return 0;
}

测新项目运行如下:
在这里插入图片描述

3.3 测试3,VBO绘制三角形

  • CMakeLists.txt
cmake_minimum_required(VERSION 2.8.1)project(my_project)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 14)# seach
find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)
find_package(GLEW REQUIRED)# include
include_directories(${OPENGL_INCLUDE_DIRS})
include_directories(${GLUT_INCLUDE_DIRS})add_executable(${PROJECT_NAME} main.cpp)target_link_libraries(${PROJECT_NAME} ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES} GLEW::GLEW)
  • main.cpp
#include <stdio.h>
#include <GL/glew.h>
#include <GL/freeglut.h>GLuint VBO;static void RenderSceneCB()
{glClear(GL_COLOR_BUFFER_BIT);glEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER, VBO);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);glDrawArrays(GL_TRIANGLES, 0, 3);glDisableVertexAttribArray(0);glutSwapBuffers();
}static void InitializeGlutCallbacks()
{glutDisplayFunc(RenderSceneCB);
}static void CreateVertexBuffer()
{const GLfloat Vertices[] = {-1.0f, -1.0f, 0.0f,1.0f, -1.0f, 0.0f,0.0f, 1.0f, 0.0f};glGenBuffers(1, &VBO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
}int main(int argc, char** argv)
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);glutInitWindowSize(800, 600);glutInitWindowPosition(0, 0);glutCreateWindow("yxy glut: VBO + triangle ");InitializeGlutCallbacks();// Must be done after glut is initialized!GLenum res = glewInit();if (res != GLEW_OK) {fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res));return 1;}glClearColor(0.6f, 0.6f, 0.6f, 1.0f);CreateVertexBuffer();glutMainLoop();return 0;
}

测新项目运行如下:
在这里插入图片描述

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

相关文章:

【小沐学OpenGL】Ubuntu环境下glut的安装和使用

文章目录 1、简介1.1 OpenGL简介1.2 glut简介1.3 freeglut 2、glut安装2.1 命令安装glut2.2 源码安装glut 3、glut测试3.1 测试1&#xff0c;版本打印3.2 测试2&#xff0c;绘制三角形3.3 测试3&#xff0c;VBO绘制三角形 结语 1、简介 1.1 OpenGL简介 OpenGL作为图形界的工业…...

ROS 发行版 jazzy 加载urdf 渲染到 RVIZ2

新版启动urdf需要两个包分别为urdf_tutorial、urdf_launch 配置package.xml <exec_depend>rviz_common</exec_depend> <exec_depend>rviz_default_plugins</exec_depend> <exec_depend>rviz2</exec_depend> <exec_depend>robot…...

SpringBoot中利用EasyExcel+aop实现一个通用Excel导出功能

一、结果展示 主要功能&#xff1a;可以根据前端传递的参数&#xff0c;导出指定列、指定行 1.1 案例一 前端页面 传递参数 {"excelName": "导出用户信息1725738666946","sheetName": "导出用户信息","fieldList": [{&q…...

排序链表(归并排序)

148. 排序链表 - 力扣&#xff08;LeetCode&#xff09; 以O(nlogn)时间复杂度&#xff0c; O(1)空间复杂度 排序链表 涉及知识点&#xff1a; 找到链表的中间节点 2095. 删除链表的中间节点 - 力扣&#xff08;LeetCode&#xff09;合并有序链表 21. 合并两个有序链…...

Adobe After Effects的插件--------CC Particle World

CC Particle World是一个粒子效果器,用于在三维空间中生成和模拟各种粒子系统,包括火焰、雨、雪、爆炸、烟雾等等。它会自动随时间变化发射粒子。 本文部分参照 https://www.163.com/dy/article/IEJVDN760536FE6V.html 使用条件 使用该插件的图层需是2D图层。 我们新建一个…...

电脑硬盘数据丢失了怎么恢复?简单实用的硬盘数据找回的方法

我们的电脑使用硬盘作为存储设备来保存数据&#xff0c;硬盘里的数据是存储在扇区上&#xff0c;这些存储数据的单元则位于表面有磁性材料的旋转的盘片上。硬盘内部的磁头悬浮于高速旋转的盘片上&#xff0c;用于读写和检索数据。 假如我们使用电脑时不小心删除了某个文件&…...

k8s调度(pod亲和、反亲和、污点、容忍度)

pod亲和性 针对对象为Pod&#xff0c;目的是实现&#xff0c;新建Pod和目标Pod调度到一起&#xff0c;在同一个Node上。 示例&#xff1a; apiVersion: v1 kind: Pod metadata:name: testpod01labels:app: myapp01env: test1 spec:containers:- name: testpod01image: nginx:…...

智能制造核心领域:自动化、物联网、大数据分析、人工智能在现代制造业中的应用与融合

一、智能制造系统及领域 智能制造系统是一套集成的解决方案&#xff0c;它利用物联网&#xff08;IoT&#xff09;、大数据分析、人工智能&#xff08;AI&#xff09;、机器学习和云计算等技术&#xff0c;实现工厂和生产线的自动化、数据驱动和智能化。这些系统能够监控和控制…...

Android Studio 2024最新版Hello World

Android Studio 2024最新版Hello World 1. Android Studio 2024安装视频2. 创建项目Read Timed out 问题Android Studio Build Output 控制台中文乱码问题 3. 驱动管理 本文章介绍如何通过Android Studio 2024最新版创建项目&#xff0c; 并成功输出Hello World。 本次教程版本…...

请解释Java中的CountDownLatch和CyclicBarrier的区别和使用场景。什么是Java中的Semaphore?它如何控制并发访问?

请解释Java中的CountDownLatch和CyclicBarrier的区别和使用场景。 CountDownLatch 和 CyclicBarrier 是 Java 并发包&#xff08;java.util.concurrent&#xff09;中提供的两个非常有用的同步工具&#xff0c;它们都用于控制多个线程之间的同步&#xff0c;但它们的目的和使用…...

Django+Vue3前后端分离学习(五)(前端登录页面搭建)

1、如果需要使用组合式API&#xff0c;需要安装插件&#xff1a; npm install vite-plugin-vue-setup-extend --save-dev 在vite.config.js里配置&#xff1a; 首先导入: import VueSetupExtend from vite-plugin-vue-setup-extend 添加&#xff1a; 2、创建login.vue 然…...

虚拟机安装macos系统

虚拟机安装macOS系统是一个相对复杂但可行的过程&#xff0c;主要涉及前期准备、虚拟机软件安装、macOS镜像准备、虚拟机配置、系统安装及后续设置等多个步骤。以下是一个详细的教程&#xff0c;帮助您在虚拟机中成功安装macOS系统。 一、前期准备 1. 硬件要求 确保您的计算…...

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态&#xff0c;生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案&#xff0c;则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时&#x…...

828华为云征文|使用sysbench对Mysql应用加速测评

文章目录 ❀前言❀测试环境准备❀测试工具选择❀测试工具安装❀mysql配置❀未开启Mysql加速测试❀开启Mysql加速测试❀总结 ❀前言 大家好&#xff0c;我是早九晚十二。 昨天有梳理一篇关于华为云最新推出的云服务器产品Flexus云服务器X。当时有说过&#xff0c;这次的华为云F…...

2024 年高教社杯全国大学生数学建模竞赛题目——D 题 反潜航空深弹命中概率问题的求解

2024 年高教社杯全国大学生数学建模竞赛题目 &#xff08;请先阅读“ 全国大学生数学建模竞赛论文格式规范 ”&#xff09; D 题 反潜航空深弹命中概率问题 应用深水炸弹&#xff08;简称深弹&#xff09;反潜&#xff0c;曾是二战时期反潜的重要手段&#xff0c;而随着现代军…...

【Kubernetes】常见面试题汇总(一)

目录 1.简述 etcd 及其特点&#xff1f; 2.简述 etcd 适应的场景&#xff1f; 3.简述什么是Kubernetes&#xff1f; 4.简述 Kubernetes和 Docker的关系&#xff1f; 1.简述 etcd 及其特点&#xff1f; &#xff08;1&#xff09;etcd 是Core0s 团队发起的开源项目&#xf…...

简单实用的php全新实物商城系统

免费开源电商系统,提供灵活的扩展特性、高度自动化与智能化、创新的管理模式和强大的自定义模块,让电商用户零成本拥有安全、高效、专业的移动商城。 代码是全新实物商城系统源码版。 代码下载...

Leetcode面试经典150题-128.最长连续序列-递归版本另解

之前写过一篇这个题的&#xff0c;但是可能代码比较复杂&#xff0c;这回来个简洁版的&#xff0c;这个是递归版本 可以看看之前的版本&#xff0c;两个版本面试用哪个都保过 解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {/**对于之前的解法&#xff0c;我…...

spring security 中的授权使用

一、认证 身份认证&#xff0c;就是判断一个用户是否为合法用户的处理过程。Spring Security 中支持多种不同方式的认证&#xff0c;但是无论开发者使用那种方式认证&#xff0c;都不会影响授权功能使用。因为 SpringSecurity 很好做到了认证和授权解耦。 二、授权 授权&#x…...

python安装以及访问openAI API

安装python 我是python小白&#xff0c;所以需要一步一步来&#xff0c;先安装。 一口吃不成胖子&#xff0c;记住。 从官网下载python&#xff0c;目前最新版本是3.12&#xff0c;但是据说稳定版3.11更好一点&#xff0c;所以&#xff0c;下载3.11&#xff0c;注意不要下载…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...