LXR | KVM | PM | Time | Interrupt | Systems Performance | Bootup Optimization

Ubuntu下OpenGL开发环境搭建、编译、测试

基于Ubuntu20.04进行OpenGL编程,使用Mesa3D开源实现方案,环境搭建、编译、测试如下。

1 环境搭建

 安装依赖库文件:

sudo apt install wayland-protocols
sudo apt install libgtk-3-dev
sudo apt-get install freeglut3-dev

GLUT(OpenGL Utility Toolkit)是一个用于OpenGL应用程序的多功能工具包,它提供了创建窗口、处理用户输入、进行绘图和动画等功能的工具。

FreeGLUT是一个开源的、跨平台的库,它是OpenGL Utility Toolkit(GLUT)的一个替代品。FreeGLUT旨在提供与原始GLUT库相同的功能,同时解决了一些原始GLUT的限制和问题。

Meson 是一个开源的构建系统,用于自动化软件的编译和构建过程。它使用一种称为 Meson 构建语言的简单语法来编写构建脚本,这些脚本定义了如何构建项目。安装meson:

sudo apt install meson

如果Ubuntu默认meson版本过低,通过pip3安装:

pip3 install --user meson

查看meson版本;

meson -v
1.4.1

2 mesa3d-demos编译和测试

获取mesa3d-demos代码:

git clone https://gitlab.freedesktop.org/mesa/demos.git

创建builddir和install目录:

mkdir builddir install

运行meson setup命令来设置构建目录:

meson --prefix=`pwd`/install builddir

在构建目录中,使用meson compile命令来编译Mesa3D Demos:

meson compile -C builddir

编译完成后,使用meson install命令将编译生成的程序安装到系统中:

meson install -C builddir

 如果需要调试或测试新的Mesa分支,可以使用Meson的devenv子命令来运行特定命令,而无需进行系统范围的安装:

meson devenv -C builddir morph3d

 显示如下:

 以morph3d为例,Ubuntu(X Window System)下OpenGL应用的依赖关系如下:

1. OpenGL:一个跨语言、跨平台的应用程序编程接口(API),用于2D和3D图形渲染,广泛应用于游戏开发、科学可视化和数据可视化等领域。Mesa是一个OpenGL实现,同时Mesa还实现了Vulkan,OpenCL,OpenVG,EGL,Gallium3D等方案。
2. glut:OpenGL Utility Toolkit,一个为OpenGL提供窗口系统接口和基本的窗口管理功能的库,简化了窗口创建、键盘和鼠标输入处理等任务。
3. GL:通常指OpenGL的动态链接库,是OpenGL API的具体实现,提供了图形渲染所需的底层函数。
4. GLdispatch:OpenGL Dispatch,一个处理OpenGL函数调用的库,可能用于管理OpenGL函数的分派和执行。
5. GLx:OpenGL X Window System,一个为OpenGL提供X Window System接口的库,允许OpenGL程序在X Window System上运行。
6. Xi:X Input Extension,X Window System的输入设备扩展,提供了对输入设备的高级支持,如多点触控、高级键盘和鼠标事件等。
7. Xxf86vm:XFree86 Video Mode Extension,X Window System的视频模式扩展,允许用户设置和查询显示设备的模式。
8. Xext:X Extension,X Window System的扩展库,提供了一些基本X Window System不支持的功能。
9. X11:X Window System的版本号,通常指代X Window System本身,是一个用于Unix和Unix-like系统的窗口系统。
10. xcb:X C-language Binding,提供了C语言的X Window System接口,允许C语言程序更直接地与X Window System交互。
11. Xdmcp:X Display Manager Control Protocol,X显示管理器控制协议,用于控制显示管理器的行为,如启动会话、关闭会话等。
12. Xau:X Authorization,X Window System的授权机制,用于处理用户认证和授权。
13. bsd:通常与Unix-like系统的BSD变种相关,可能指的是BSD系统的一些库或工具,用于提供网络编程、文件系统操作等功能。
这些库在Linux系统中用于支持图形界面和窗口管理,以及提供对OpenGL图形渲染的支持。它们对于开发具有图形用户界面的应用程序至关重要。

3 demo解析

src/trivial/tri.c · main · Mesa / demos · GitLab为例:

  • 初始化glut,以及窗口、显示模式等。
  • 初始化屏幕颜色等。
  • 注册窗口改变回调函数、按键回调函数、窗口重绘回调函数。
  • 事件循环处理。
main
  glutInit--初始化GLUT,并处理命令行参数。
  glutInitWindowPosition--设置窗口的初始位置。
  glutInitWindowSize--设置窗口的初始大小。
  glutInitDisplayMode--设置显示模式,如RGB颜色、双缓冲和深度缓冲。
  glutCreateWindow--创建窗口,并为其提供一个名称。
  Init
    glClearColor--设置清除屏幕时使用的颜色。当你调用 glClear 函数清除屏幕时,glClearColor 定义的颜色将被用于填充颜色缓冲区。
  glutReshapeFunc--注册窗口大小改变回调函数。
    Reshape
      glViewport--用于设置视口的大小和位置,即决定屏幕哪一部分用于绘制OpenGL图形。
      glMatrixMode--用于指定当前操作的矩阵模式:GL_MODELVIEW、GL_PROJECTION、GL_TEXTURE。
      glLoadIdentity--用于重置当前矩阵为单位矩阵,通常在改变矩阵模式后使用以清除之前的矩阵状态。
      glOrtho--用于设置一个正交投影,它创建一个与观察方向垂直的平行投影面,常用于2D图形。
      glMatrixMode--在设置完投影矩阵后,可能需要切换回模型视图矩阵以进行后续的图形变换。
  glutKeyboardFunc--注册键盘按键回调函数。
    Key
      glutDestroyWindow--销毁一个先前由glutCreateWindow或glutCreateSubWindow创建的窗口。
      glutPostRedisplay--请求重绘当前窗口。调用此函数后,GLUT 会安排在下一个事件处理循环迭代中调用当前窗口的显示回调函数。
  glutDisplayFunc--指定一个回调函数,用于当窗口需要重绘时被调用。
    Draw
      glClear--用于清除窗口的颜色缓冲区、深度缓冲区、模板缓冲区等。通常在新的一帧开始时调用,以清除上一帧的内容。
      glBegin--标记立即模式绘制的开始,需要与 glEnd 配对使用。立即模式是OpenGL中的一种旧的绘制方式,现在更推荐使用顶点数组或着色器进行渲染。
      glColor3f--在立即模式中设置当前绘制颜色。接受三个浮点数参数,分别代表红色、绿色和蓝色的强度值,范围从0.0到1.0。
      glVertex3f--在立即模式中指定顶点位置。接受三个浮点数参数,分别代表顶点的x、y和z坐标。
      glEnd--标记立即模式绘制的结束。与 glBegin 配对使用,结束一系列的顶点和颜色等的指定。
      glFlush--用于清空OpenGL的命令缓冲区,并确保所有命令被发送到GPU执行。通常在渲染完成后调用,以确保渲染结果被立即显示。
      glutSwapBuffers--用于交换前后缓冲区,这是双缓冲技术的一部分,用于减少视觉撕裂和闪烁。通常在渲染完成后调用,以展示当前帧的渲染结果,并开始下一帧的渲染。
  glutMainLoop--进入GLUT事件处理循环,等待用户交互。

 

posted on 2024-06-29 23:59  ArnoldLu  阅读(586)  评论(0编辑  收藏  举报

导航