【小沐学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???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/419218.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024最新!Facebook手机版和网页版改名教程!

Facebook作为全球最大的社交平台之一&#xff0c;允许用户自定义名字和昵称。在Facebook更新姓名可以帮助您更好的展现账号形象。本文将为您提供详细的步骤指导&#xff0c;帮助您在手机APP和网页版上轻松完成Facebook改名操作。 Facebook手机版改名 打开Facebook APP并登录账号…

构建模块化的FastAPI应用: 从用户认证到角色控制

实现了用户身份验证及角色授权的基本功能。具体来说&#xff0c;当用户尝试访问某些资源时&#xff0c;系统会首先验证用户的身份&#xff0c;然后根据用户的角色来决定是否允许访问特定资源。例如&#xff0c;普通用户只能访问自己的信息&#xff0c;而管理员可以访问额外的管…

UnLua调用C++函数

一、UnLua调用C全局静态函数 1、新建C类MyLuaUtils&#xff0c;继承BlueprintFunctionLibrary,实现全局静态函数GetInt。 MyLuaUtils.h UCLASS() class LUASHOOTING_API UMyLuaUtils : public UBlueprintFunctionLibrary {GENERATED_BODY()UFUNCTION(BlueprintCallable)static…

Python 神器:wxauto 库——解锁微信自动化的无限可能

&#x1f4dd;个人主页&#x1f339;&#xff1a;誓则盟约 ⏩收录专栏⏪&#xff1a;机器学习 &#x1f921;往期回顾&#x1f921;&#xff1a;“探索机器学习的多面世界&#xff1a;从理论到应用与未来展望” &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f…

GPIO 简介(STM32F407)

一、GPIO简介 什么是GPIO GPIO即通用输入输出端口&#xff0c;全称General Purpose Input Output&#xff0c;是控制或者采集外部器件的信息的外设&#xff0c;即负责输入输出。 它按组分配存在&#xff0c;每组最多16个IO口&#xff0c;组数视芯片而定。比如STM32F407ZGT6是…

【Python】Python 读取Excel、DataFrame对比并选出差异数据,重新写入Excel

背景&#xff1a;我在2个系统下载出了两个Excel&#xff0c;现在通过对下载的2个Excel数据&#xff0c;并选出差异数据 从新写入一个新的Excel中 differences_url rC:\Users\LENOVO\Downloads\differences.xlsx; //要生成的差异Excel的位置及名称 df1_url rC:\Users\LENOVO\Dow…

大数据新视界--大数据大厂之Java 与大数据携手:打造高效实时日志分析系统的奥秘

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Spring源码(3)Aware接口、初始化和销毁方法、@Scope、@Primary

1、目标 本文的主要目标是学习Spring源码中Aware接口、初始化和销毁方法、Scope注解、Primary注解的使用 2、Aware接口 Component public class MyBeanAware implements BeanNameAware, ApplicationContextAware {Overridepublic void setBeanName(String name) {System.out…

从JavaScript入门Go三

前情提要 上一章中我们讲了Go中的变量与函数&#xff0c;这一节我们说说Go中的逻辑语法for、if、switch。最近正好有空&#xff0c;正好给大家更新一下入门的第三章。 PS&#xff1a;没看过的第一章、第二章的小伙伴&#xff0c;可以进入下面的链接查看 从JavaScript入门Go一 从…

计算机毕业设计 | vue+springboot在线投稿管理 稿件文章报社管理系统 (附源码)

1&#xff0c;绪论 1.1 行业趋势与需求 随着互联网的发展和普及&#xff0c;越来越多的出版社、杂志社和媒体开始采用在线投稿系统。这种系统提供了一个便捷的平台&#xff0c;让作者可以直接将他们的文章提交到相应的出版机构&#xff0c;而无需邮寄或亲自递交稿件。这不仅节…

Web服务器配置管理

目录 一、设计内容&#xff1a; 二、摘 要 三、课题描述 四、需求分析 五、概要设计 六、详细设计 七、结果分析 八、总结 一、设计内容 Web服务器的安装与配置管理。 1.任务说明 C/S 模式的网络环境&#xff0c;包括一台Windows工作站和一台Windows Server 服务器。 2.要求 ①…

图论(2)

一、度 度统计的是一个节点上又多少条边 度出度入度 出度&#xff1a;统计以该节点为起始点箭头指向外面的边的条数 入度&#xff1a;统计箭头指向该节点的边数 度为1的节点为悬挂节点&#xff0c;边为悬挂边 用矩阵计算节点的度 二、握手定理 比如这里第一个集合里面有三…

35天学习小结

距离上次纪念日&#xff0c;已经过去了35天咯 算算也有5周了&#xff0c;在这一个月里&#xff0c;收获的也挺多&#xff0c;在这个过程中认识的大佬也是越来越多了hh 学到的东西&#xff0c;其实也没有很多&#xff0c;这个暑假多多少少还是有遗憾的~ 第一周 学习了一些有…

掌握Java对象本质:从打工者到技术专家的飞跃

1.1 从机器视角到问题视角的演变 在计算机科学的发展历程中&#xff0c;我们见证了从机器视角到问题视角的深刻转变。这一转变不仅体现了编程语言和技术的进步&#xff0c;更反映了我们对问题解决方式理解的深化。 起初&#xff0c;计算机编程主要依赖于机器视角。汇编语言作…

MACD指标精讲PART1:MACD指标入门及使用法则

一、MACD指标入门 MACD&#xff08;Moving Average Convergence Divergence&#xff09;指标称为指数平滑异同移动平均线指标&#xff0c;是由Geral Apple所创造&#xff0c;用来跟踪股价运行趋势、判断股票买卖时机的技术分析工具。 MACD指标由DIFF线&#xff08;Difference线…

浅谈架构实战

目录 背景 1 架构演变 2 如何实现高层的复用 2 中台产生案例 3 技术架构的核心要点 4 技术架构的高可用案例 背景 业务架构、数据架构、应用架构和技术架构它们是相互关联和相互支持的&#xff0c;共同构成了企业的总体架构&#xff0c;业务架构是源头&#xff0c;然后才…

强推!创新直发核心!时序分解+优化组合+模型对比!VMD-SSA-Transformer-BiLSTM多变量时间序列预测

强推&#xff01;创新直发核心&#xff01;时序分解优化组合模型对比&#xff01;VMD-SSA-Transformer-BiLSTM多变量时间序列预测 目录 强推&#xff01;创新直发核心&#xff01;时序分解优化组合模型对比&#xff01;VMD-SSA-Transformer-BiLSTM多变量时间序列预测效果一览基…

如何将图表数据拟合为函数

1. 数据准备 收集图表数据&#xff0c;包括独立变量&#xff08;如 x值&#xff09;和因变量&#xff08;如 y 值&#xff09;。这些数据可以是离散的点&#xff0c;通常表示为一组 (x1,y1),(x2,y2),…,(xn,yn)。 2. 选择模型 选择拟合函数的模型。这取决于数据的特征及其在…

YOLO配合 PYQT做自定义虚拟电子围-自定义绘制多边形虚拟电子围栏

1、目标检测&#xff1a; YOLO可以识别检测物体&#xff0c;这是众所周知的。使用YOLO来做目标检测&#xff0c;并获取坐标信息。 2、电子围栏 比如在监控中&#xff0c;指定一块区域&#xff0c;如果有目标进入&#xff0c;则发出警报&#xff0c;并提示。比如下图标红的区…

使用rabbitmq发送消息和caffeineCache保存本地

目录 使用stock_job工程采集到国内大盘的最新交易时间的信息并插入数据库&#xff0c;使用rabbitmq发送消息 1.导入依赖 2.编写yml文件&#xff0c;配置连接rabbitmq的信息 3.编写mq的配置类&#xff0c;生成交换机&#xff0c;消息队列&#xff0c;并将他们绑定 4.采集最新…