Hello OpenGL
程序员文章站
2022-06-16 23:15:12
...
文章目录
前言
- OpenGL是一个图形库规范,它定义了一组用于创建和渲染图片的接口,严格规定了每个函数该如何执行,以及它们的输出值。但内部具体每个函数是如何实现的,将由OpenGL库的开发者自行决定,这通常都是显卡厂商。每个OpenGL的驱动都是针对特定厂商的显卡,开发者利用自己显卡的特有功能,可以高效的实现某些OpenGL接口。
- 总结一句话,OpenGL是规范,实现由各个显卡厂商提供,每个显卡厂商实现的驱动各有不同。因为这种情况,OpenGL的很多函数在编译时地址不能确定,上层应用需要用动态加载的方式使用OpenGL提供的图形库。通常的做法是,开发应用程序时如果要使用OpenGL库提供的函数,首先动态加载OpenGL库,然后检查库中是否包含自己想要调用的函数的符号,如果包含,就调用该函数,过程类似下面这样:
- 打开一个OpenGL动态库,返回一个库的句柄
handle = dlopen(file, flags)
- 检查动态库中是否有自己想调用的函数
regsym = dlsym(handle, funcname)
- 返回值regsym不小于0表示动态库中存在这个函数,调用它
funcname( )
- 使用完之后关闭这个动态库的句柄
dlclose(handle)
- 上面这个流程是C语言的接口动态解决一个so库并调用其包含函数的过程,OpenGL提供的so库使用方式类似。由于OpenGL各个版本提供的API有所差异,因此应用程序需要了解自己使用的OpenGL库包含哪些接口,对于每个接口,保险的方法是用以上的方式来调用,但这样太复杂了,并且应用程序也可能不知道自己使用的OpenGL库包含的接口。有一个开源的库专门解决这个问题,它针对每一个OpenGL版本的接口实现了上述的判断,这就是GLAD库。我们的环境搭建中需要依赖这个库。
- OpenGL是一个实现3D图像渲染的图形库,它自身是一个巨大的状态机,通过一系列的输入变量描述OpenGL此刻该如何运行,OpenGL的状态通常被称为上下文(context),context上下文的创建涉及到显卡缓冲区等与具体系统相关的细节,因为每个平台上的实现不一样。为了让OpenGL具有可移植性,它特意将这些操作抽象出去。因此应用程序需要自己处理context的创建。同样的,如果我们想要展示自己渲染的图片,需要一个用于显示的窗口,这个窗口也是平台相关的。因此也需要应用程序自己处理。同样地,当前也有一些库是特别针对OpenGL这种需求的,它们为OpenGL的渲染提供一个上下文和一个窗口。这些流行的库有GLUT,SDL,SFML和GLFW等。这里我们将使用GLFW,同时也会涉及到GLUT库。
- 综上所述,要基于OpenGL库开发应用程序,不仅要安装OpenGL库,还依赖GLAD库和GLFW库。整个OpenGL开发环境的搭建就是介绍这个安装过程。
安装OpenGL
- 在centos上,我们配置了yum源之后,直接安装libglvnd-glx包,就能将OpenGL和它依赖的库全部安装上
yum install -y libglvnd-glx
- 安装OpenGL库之后,我们还不知道它的API版本,freeglut是一个用于创建OpenGL窗口和上下文的库,这里我们使用这个库来查询OpenGL API版本。首先安装这个库的开发包
yum install -y freeglut-devel
,然后编译一个C程序来确定版本。如下:
#include <stdio.h>
#include <GL/glut.h>
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH); /* 1 */
glutInitWindowSize(300,300); /* 2 */
glutInitWindowPosition(100,100); /* 3 */
glutCreateWindow("OpenGL Version");
const GLubyte* OpenGLVersion =glGetString(GL_VERSION); /* 4 */
printf("OpenGL实现的版本号:%s\n",OpenGLVersion);
return 0;
}
1. 显示模式初始化
2. 定义窗口大小
3. 创建窗口
4. 返回当前OpenGL实现的版本号
- 编译后运行结果如下:
- 从这里可以看到只有加载OpenGL才能看到它的实现版本号,这里是3.0
安装GLAD
- GLAD是一个开源库,但和普通库不同,它是一个在线服务,用户进入这个网页输入自己的OpenGL库版本产生一个glad.c的文件和一个glad.h头文件,我们将glad.c文件编译成目标文件glad.o后与应用程序一起编译,同时需要将glad提供的头文件glad.h包含在我们自己的应用中,通过这种方式,应用程序就可以使用glad库中定义的接口了。
- 从在线服务中下载下来的glad.zip内容如下:
- 我们将glad.c编译成目标文件
gcc -c glad.c -o glad.o
- 将glad.h拷贝到系统的头文件目录下
cp -r glad/include/glad /usr/include/
安装GLFW
- GLFW是个开源库,我们从源码编译安装,首先下载源码
git clone [email protected]:glfw/glfw.git
- GLFW使用cmake编译,linux平台下源码目录下载后没有Makefile文件,需要首先生成,使用cmake命令产生Makefile,编译然后安装,如下:
cd glfw
cmake .
make
make install
- 安装完GLFW之后,应用程序所需要的所有连接库都准备好了,可以开始编译应用程序。
Hello OpenGL
- 我们的程序就是利用GLFW库接口创建一个窗口,其源码在这里,然后编译运行这个程序。
- 我们的源码文件名为hello.cpp,编译这个文件:
g++ hello.cpp glad.o -o hello -lglut -lGL -lGLU -lglfw3 -lGL -lX11 -lpthread -lXrandr -lXi -ldl
- 运行hello程序,界面上就会弹出一个窗口,窗口大小有hello中的源码设置,我将它调成了200 * 200大小,效果如下:
上一篇: CI怎么在子目录上可以设置默认控制器
下一篇: CUDA编程:caffe中GPU编程
推荐阅读
-
Spring Boot实战之逐行释义Hello World程序
-
混合语言编程—C#使用原生的Directx和OpenGL绘图的方法
-
Android开发之OpenGL绘制2D图形的方法分析
-
Java常见问题之javac Hello.java找不到文件的解决方法
-
Spring Boot实战之逐行释义Hello World程序
-
Android开发之OpenGL绘制2D图形的方法分析
-
Java常见问题之javac Hello.java找不到文件的解决方法
-
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
-
Android编程之OpenGL绘图技巧总结
-
通过OpenGL ES混合模式缩放视频缓冲区来适应显示尺寸