我对何时需要使用像 GLEW 这样的 OpenGL 函数加载器感到有些困惑。通常,您似乎首先获得了一个窗口和有效的 OpenGL 上下文,然后尝试加载函数。
最佳答案
只有在 Windows 和 Linux 上才需要函数加载器。以下是您如何在不同平台上为各种 OpenGL 版本构建的快速概览。
window
Windows 开发工具仅包含 OpenGL 1.1 的 header 。阴谋论者可能会声称,微软对使 OpenGL 的使用变得容易不感兴趣,因为它希望开发人员使用专有的 API。
对于 1.1 之后的任何内容,您需要通过调用 wglGetProcAddress()
动态加载入口点。 .像 GLEW 这样的库为更高版本的 OpenGL 提供了头文件,并封装了加载入口点的逻辑。
Linux
我还没有在 Linux 上进行过 OpenGL 编程。据我所知,它需要类似于 Windows 的功能加载。有关详细信息,我将遵从@datenwolf 的回答。
苹果系统
Mac OS 支持两个主要的 OpenGL 功能集:
<OpenGL/gl.h>
来使用. <OpenGL/gl3.h>
. 在这两种情况下,您都不需要任何动态函数加载。头文件包含可以支持的最高版本的所有声明/定义,并且您链接的框架(使用
-framework OpenGL
)解析函数名称。您可以在构建时使用的最大版本取决于您构建的平台 SDK。默认情况下,这是与构建机器的操作系统相匹配的平台 SDK。但是您可以使用
-isysroot
来更改它。构建选项。在运行时,机器必须至少运行与构建时使用的平台 SDK 匹配的操作系统,并且您只能使用 GPU 支持的最高版本的功能。您可以大致了解哪些硬件支持哪些版本:
https://developer.apple.com/opengl/capabilities/
http://support.apple.com/en-us/HT202823
安卓、NDK
使用 Android 上的 native 代码,您可以在设置上下文和表面时选择 OpenGL 版本。然后,您的代码将包含所需的 header (如
<GLES2/gl2.h>
或 <GLES3/gl3.h>
)和匹配库的链接。不需要动态函数加载。如果目标设备不支持您尝试使用的版本,则上下文创建将失败。您可以在 list 中包含一个条目,以防止应用程序安装在不支持所需 ES 版本的设备上。
安卓、Java
这与 NDK 的情况非常相似。在安装过程中指定所需的版本,例如在创建
GLSurfaceView
时.GLES20
类包含 ES 2.0 的定义。 GLES30
源自 GLES20
,并添加了 ES 3.0 的附加定义。iOS
毫不奇怪,这与 Mac OS 非常相似。您包含与所需 OpenGL ES 版本匹配的头文件(例如
<OpenGLES/ES3/gl.h>
),链接到框架,您就完成了。同样与 Mac OS 匹配,您可以构建的最大版本取决于您选择的平台 SDK 版本。然后,您要运行的设备必须至少使用与此平台 SDK 版本匹配的操作系统版本,并支持您正在使用的 OpenGL ES 版本。
一个主要区别显然是您在 Mac 上交叉编译应用程序。 iOS 使用一组不同的平台 SDK,具有不同的 header 和框架,但整个过程与为 Mac OS 构建几乎相同。
关于opengl - 什么时候需要使用 OpenGL 函数加载器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27873784/