Hello OpenGL

前言

  • OpenGL是一个图形库规范,它定义了一组用于创建和渲染图片的接口,严格规定了每个函数该如何执行,以及它们的输出值。但内部具体每个函数是如何实现的,将由OpenGL库的开发者自行决定,这通常都是显卡厂商。每个OpenGL的驱动都是针对特定厂商的显卡,开发者利用自己显卡的特有功能,可以高效的实现某些OpenGL接口。
  • 总结一句话,OpenGL是规范,实现由各个显卡厂商提供,每个显卡厂商实现的驱动各有不同。因为这种情况,OpenGL的很多函数在编译时地址不能确定,上层应用需要用动态加载的方式使用OpenGL提供的图形库。通常的做法是,开发应用程序时如果要使用OpenGL库提供的函数,首先动态加载OpenGL库,然后检查库中是否包含自己想要调用的函数的符号,如果包含,就调用该函数,过程类似下面这样:
  1. 打开一个OpenGL动态库,返回一个库的句柄handle = dlopen(file, flags)
  2. 检查动态库中是否有自己想调用的函数regsym = dlsym(handle, funcname)
  3. 返回值regsym不小于0表示动态库中存在这个函数,调用它funcname( )
  4. 使用完之后关闭这个动态库的句柄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 git@github.com: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大小,效果如下:
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

享乐主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值