opengl - 什么时候需要使用 OpenGL 函数加载器?

标签 opengl opengl-es

我对何时需要使用像 GLEW 这样的 OpenGL 函数加载器感到有些困惑。通常,您似乎首先获得了一个窗口和有效的 OpenGL 上下文,然后尝试加载函数。

  • 有时这些功能被称为扩展,有时它们也被称为核心功能。似乎加载并归类为“核心”和“扩展”的内容取决于平台。除了某些基本集之外,还加载了哪些功能?
  • 您是否也需要在 OpenGL ES 平台上以相同的方式加载函数?快速浏览一下 GLEW,我看不到对 Open GL ES 的任何明确支持。其他 GL 函数加载器库确实明确提到了专门针对 ES 的支持(例如 https://github.com/Dav1dde/glad )
  • 最佳答案

    只有在 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 2.1。这通过包含 <OpenGL/gl.h> 来使用.
  • OpenGL 3.x 及更高版本,仅限核心配置文件。用于包含 <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/

    相关文章:

    performance - Opengl glScalef 重置性能

    ios - Monotouch - 显示一系列图像(太慢)

    带有裁剪或 VBO 的 Android OpenGL ES draw_texture?

    c++ - OpenGL 中的地形小 map ?

    c++ - 抑制 openGL 运行时警告

    c++ - 平移和缩放后更新 OpenGL 立方体?

    ios - 嵌套 GLKViewController

    opengl-es - Android,使用 NDK 优雅地关闭 OpenGL?

    android - 如何在 OpenGL ES 2 中正确缩放

    c++ - 在 QImage 中访问像素的最快方法是什么?