首页 > 其他分享 >OpenGL:一个黑框的诞生

OpenGL:一个黑框的诞生

时间:2024-05-31 17:11:38浏览次数:15  
标签:函数 诞生 OpenGL GLFW 黑框 GLEW 上下文 我们

OpenGL并不是API,它不包含任何代码,仅仅只是一个关于输入输出的标准。关于OpenGL的具体实现则是由各个开发商负责。

OpenGL是以状态机的方式进行控制,我们通过改变一些上下文变量来改变OpenGL状态,从而告诉OpenGL如何去绘图。一旦我们改变了OpenGL的状态为绘制线段,下一个绘制命令就会画出线段而不是三角形。

GLFW

在我们画出出色的效果之前,首先要做的就是创建一个OpenGL上下文(Context)和一个用于显示的窗口。然而,这些操作在每个系统上都是不一样的,OpenGL有意将这些操作抽象(Abstract)出去。这意味着我们不得不自己处理创建窗口,定义OpenGL上下文以及处理用户输入。

幸运的是,有一些库已经提供了我们所需的功能,其中一部分是特别针对OpenGL的。这些库节省了我们书写操作系统相关代码的时间,提供给我们一个窗口和一个OpenGL上下文用来渲染。最流行的几个库有GLUT,SDL,SFML和GLFW。在这里我使用的是GLFW。

简单来说GLFW为我们屏蔽了不同操作系统中创建显示窗口和OpenGL上下文的接口,并将其统一抽象为一个API,方便我们进行操作。

GLEW

到这里还没有结束,我们仍然还有一件事要做。因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。

取得地址的方法因平台而异,在Windows上会是类似这样:

// 定义函数原型
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// 找到正确的函数并赋值给函数指针
GL_GENBUFFERS glGenBuffers  = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// 现在函数可以被正常调用了
GLuint buffer;
glGenBuffers(1, &buffer);

你可以看到代码非常复杂,而且很繁琐,我们需要对每个可能使用的函数都要重复这个过程。幸运的是,有些库能简化此过程,我采用的是GLEW,当然也有更新和更好的库,比如GLAD等。

GLEW则是为我们提供了更为方便的接口运用OpenGL中规定的函数。

运用GLFW和GLEW库就可以更为简单和直接的进行OpenGL的学习和开发。

标签:函数,诞生,OpenGL,GLFW,黑框,GLEW,上下文,我们
From: https://www.cnblogs.com/warren-j1an/p/18224870

相关文章