定义GL_GLEXT_PROTOTYPES与获取函数指针

时间:2013-07-08 10:51:45

标签: opengl

我正在编写一个依赖于OpenGL 2.0或更高版本的程序。看看GL 2.0的规格,我看到ARB_shader_objects中定义的扩展已被提升,我认为GL版本2.0及更高版本以及支持>的任何实现都不再需要ARB前缀。 GL2.0将此作为核心实施的一部分。

说到我在Linux上编译程序gcc时会发出警告:隐式声明函数。获取这些函数的一种方法是在程序本身中声明它们,然后通过* GetProcAddress函数获取函数指针。

另一种方法是在包含glext.h之前定义GL_GLEXT_PROTOTYPES,它避免了获取每个函数的函数指针的问题,这些函数现在默认存在于GL2.0或更高版本中。有人可以建议,如果这是一个推荐和正确的方式?基线是我的程序需要OpenGL 2.0或更高版本,我不想支持任何比GL2.0更少的东西。

如果有人建议使用欢乐或glew,我不想使用/有选项来使用欢乐或glew库来实现同样的目标。

1 个答案:

答案 0 :(得分:9)

这里有两个问题。

GL_ARB_shader_objects确实在GL2.0中被提升为核心,但核心版本的API略有变化,因此它不仅仅是没有ARB前缀的相同函数名称,例如有glCreateShader()代替glCreateShaderObjectARB(),而两个函数glGetShaderInfoLog()glGetProgramInfoLog()代替glGetInfoLogARB()以及其他一些细微差别排序

第二个问题是假设GL库全部导出 核心功能。在Linux上通常就是这种情况(不仅是核心功能,而且基本上都适用于所有内容),但没有标准保证。 OpenGL ABI for Linux只需要:

  

3.4。库必须静态导出所有OpenGL 1.2,GLU 1.3,GLX 1.3和ARB_multitexture入口点。

proposals for an update但我最近没有听到任何关于此事的消息。

Windows仅导出OpenGL 1.1核心,因为opengl32.dll是操作系统的一部分,而ICD是在一个单独的dll中。你必须查询几乎所有东西的函数指针。

因此,无论您是手动执行还是使用像glew这样的库,最便携的方式绝对是查询内容。