opengl - 定义 GL_GLEXT_PROTOTYPES 与获取函数指针

标签 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 的任何东西。

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

最佳答案

这里有两个问题。
GL_ARB_shader_objects确实在 GL2.0 中被提升为核心,但核心版本的 API 略有变化,所以它不仅仅是没有 ARB 前缀的相同函数名称,例如有glCreateShader()而不是 glCreateShaderObjectARB() ,以及两个函数 glGetShaderInfoLog()glGetProgramInfoLog()更换 glGetInfoLogARB()以及其他一些类似的细微差别。

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

3.4. The libraries must export all OpenGL 1.2, GLU 1.3, GLX 1.3, and ARB_multitexture entry points statically.



proposals for an update但我最近没有听说过。

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

因此,最可移植的方式绝对是查询内容,无论您是手动执行还是使用诸如glew 之类的库。

关于opengl - 定义 GL_GLEXT_PROTOTYPES 与获取函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17524794/

相关文章:

c++ - 哪个缓存最友好?

c++ - 从 C++ 代码中获取已编译的 glsl 着色器统一参数的大小

opengl - 为什么人们在 GLSL 中写 0.00390625 而不是 1.0/256.0?

c++ - OpenGL 通过重新规范更新 VBO 数据

c++ - 关于 GLM 网格中的碰撞检测

c++ - 阴影体积 - 寻找轮廓

c++ - 如何使用 OpenGL 在 Windows 上的同一个应用程序中绘制两个单独的 3D 窗口?

opengl - 4D 和 GLSL,是否支持矩阵 5x5?

opengl - 在OpenGL中更新纹理的有效方法

c++ - 在 OpenGL 中使用多个纹理