GLEW是什么以及为什么我需要它?

29

好的,我已经知道为什么需要GLEW,但只了解到某个程度。

如果我正在使用现代OpenGL内容,可能从3.0版本开始和/或使用核心配置文件,则需要GLEW,否则编译会出现错误,例如未声明glGenVertexArrays

因此,GLEW会背景地处理我们想要使用的一些现代OpenGL函数。

除此之外,它还有其他功能吗?它是如何工作的?

例如,它能改善跨平台编译吗?(例如,从Linux移植到Windows或OS X时,需要更少的代码修改吗?)

它还能改善图形硬件的跨平台性吗?例如,假设我们有两台完全相同的计算机,包括操作系统。程序在一个系统上使用OpenGL 4.3命令进行编译。如果另一个系统具有仅支持OpenGL 3.3的图形卡或驱动程序,GLEW是否有帮助?(也许编译较旧版本的OpenGL着色器?)

所以你可能看出来我实际上并不知道GLEW做了什么或者它是如何做到的。

最后一点;有人知道如何在GLFW中使用GLEW吗?我可能会单独发布一个问题。

2个回答

15

GLEW并不是“必需的”,正如您所说。您可以使用glcorearb.h头文件或类似的内容。但是,如果您链接到某些函数,则该函数必须存在于目标平台上,否则您的程序将无法启动。 GLEW和其他工具正是用来处理这个问题的 - 您不直接链接GL函数,而是在初始化阶段后获取函数指针。它允许您在运行时检查哪些扩展存在以及可以使用哪些函数。

它唯一有助于可移植性的是获取函数指针 - 可能是wglGetProcAddress / glxGetProcAddress以及apple OSes的类似功能。所以不,这不是一个案例。但是,可用GL扩展的种类却是一个案例。

GLEW与您的首选GL初始化库没有任何接触点 - 只需在创建GL上下文后调用glewInit即可。


如果我创建一个窗口,然后调用glewInit()函数,会出现段错误吗? - FreelanceConsultant
@EdwardBird:你在那个窗口上创建了OpenGL上下文吗?在调用glewInit时,是否已经激活了OpenGL上下文? - datenwolf
是的,我已经解决了问题 - 无论如何还是谢谢 (: - FreelanceConsultant

6
为了正确初始化glew,必须先创建OpenGL上下文并在调用`glewInit()`之前调用`wglMakeCurrent()`。
我想将此内容放入keltar答案的评论中,但我不知道如何做到这一点。

为什么需要wglMakeCurrent()?这是特定于平台还是每个操作系统都需要它? - Bilal Siddiqui
1
它是针对Windows的,目的是使渲染上下文处于活动状态,以便您可以调用gl命令而不会出现错误。 - tamato
所以我认为Linux或OS X可能不需要它?顺便说一句,响应速度令人印象深刻。 - Bilal Siddiqui
他们每个人都有自己的版本。 - tamato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接