8

我正在编写一个依赖于 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 的任何东西。

万一有人建议使用glee 或glew,我不想使用/可以选择使用glee 或glew 库来实现相同的目的。

4

1 回答 1

11

这里有两个问题。

GL_ARB_shader_objects确实在GL2.0中被提升为核心,但是核心版本的API略有改变,所以不仅仅是没有ARB前缀的相同函数名,例如有glCreateShader()instead of glCreateShaderObjectARB(),以及这两个函数glGetShaderInfoLog()glGetProgramInfoLog()replacement glGetInfoLogARB()and some其他类似的细微差别。

第二个问题是假设 GL 库导出所有核心函数。在 Linux 上通常是这种情况(不仅适用于核心功能,而且基本上适用于所有功能),但没有标准可以保证这一点。Linux的OpenGL ABI只需要:

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

更新的建议,但我最近没有听到任何消息。

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

所以最便携的方法是明确地查询这些东西,不管你是手动做还是使用像 glew 这样的库。

于 2013-07-09T18:47:07.597 回答