使用 GL_EXT_color_buffer_half_float 和 Android NDK
Using GL_EXT_color_buffer_half_float with Android NDK
我正在尝试将 GL_EXT_color_buffer_half_float
OpenGL ES 2.0 扩展与本机 Android NDK 应用程序一起使用。 OpenGL ES 2.0 扩展在 <GLES2/gl2ext.h>
header 中定义。问题是 GL_EXT_color_buffer_half_float
扩展未在 <GLES2/gl2ext.h>
header 中定义,直到 Android API 级别 21**,对应于 Android 5.0“棒棒糖”。 header 的早期版本未定义 GL_EXT_color_buffer_half_float
扩展,因此当我尝试针对较早的 API 级别(如 10 或 14)进行编译时,我收到未声明的标识符错误:
error: use of undeclared identifier 'GL_RGBA16F_EXT'
如果我从 API 级别 21 转到 <GLES2/gl2ext.h>
header 并复制 GL_EXT_color_buffer_half_float
扩展名并将其放在我自己的 header 中:
#ifndef GL_EXT_color_buffer_half_float
#define GL_EXT_color_buffer_half_float 1
#define GL_RGBA16F_EXT 0x881A
#define GL_RGB16F_EXT 0x881B
#define GL_RG16F_EXT 0x822F
#define GL_R16F_EXT 0x822D
#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211
#define GL_UNSIGNED_NORMALIZED_EXT 0x8C17
#endif /* GL_EXT_color_buffer_half_float */
然后一切似乎都正常工作。我们确实会检查以确保 GL_EXT_color_buffer_half_float
在使用它之前在设备上实际可用,因此我们不应该 运行 在不支持该扩展的设备上使用它的代码。然而,这似乎是一个可怕的、丑陋的 hack。
有更好的方法吗?使用未包含在 <GLES2/gl2ext.h>
header 但受 OS/device 支持的 OpenGL 扩展的“正确”方法是什么?
**注意: 我尝试使用 API 级别 21 编译我们的应用程序,但是当我这样做时,应用程序不会 运行设备(Android 4.4,API 20 级)。它在 Android 5.0 设备上只有 运行s。我还不确定这是否是我们应用程序的问题,或者这是否根本不可能。有谁知道使用 NDK API 级别 21 编译的应用程序是否有可能在旧 API 版本上编译到 运行?
这是一个很好的方法。
在平台实际附带 header 包含扩展的平台之前,您必须阅读和解析扩展规范才能生成这些内容。在 GLEW 等存在之前,我编写了一些 perl 代码,这些代码会为我需要的扩展吐出 headers。你总是可以这样做,但现在似乎没有必要,因为你可以直接从 Khronos here.
获得最新的 header
如果扩展被列为已实现,请将其归结为 SDK 版本中的一个遗漏,并随时使用它。
我正在尝试将 GL_EXT_color_buffer_half_float
OpenGL ES 2.0 扩展与本机 Android NDK 应用程序一起使用。 OpenGL ES 2.0 扩展在 <GLES2/gl2ext.h>
header 中定义。问题是 GL_EXT_color_buffer_half_float
扩展未在 <GLES2/gl2ext.h>
header 中定义,直到 Android API 级别 21**,对应于 Android 5.0“棒棒糖”。 header 的早期版本未定义 GL_EXT_color_buffer_half_float
扩展,因此当我尝试针对较早的 API 级别(如 10 或 14)进行编译时,我收到未声明的标识符错误:
error: use of undeclared identifier 'GL_RGBA16F_EXT'
如果我从 API 级别 21 转到 <GLES2/gl2ext.h>
header 并复制 GL_EXT_color_buffer_half_float
扩展名并将其放在我自己的 header 中:
#ifndef GL_EXT_color_buffer_half_float
#define GL_EXT_color_buffer_half_float 1
#define GL_RGBA16F_EXT 0x881A
#define GL_RGB16F_EXT 0x881B
#define GL_RG16F_EXT 0x822F
#define GL_R16F_EXT 0x822D
#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211
#define GL_UNSIGNED_NORMALIZED_EXT 0x8C17
#endif /* GL_EXT_color_buffer_half_float */
然后一切似乎都正常工作。我们确实会检查以确保 GL_EXT_color_buffer_half_float
在使用它之前在设备上实际可用,因此我们不应该 运行 在不支持该扩展的设备上使用它的代码。然而,这似乎是一个可怕的、丑陋的 hack。
有更好的方法吗?使用未包含在 <GLES2/gl2ext.h>
header 但受 OS/device 支持的 OpenGL 扩展的“正确”方法是什么?
**注意: 我尝试使用 API 级别 21 编译我们的应用程序,但是当我这样做时,应用程序不会 运行设备(Android 4.4,API 20 级)。它在 Android 5.0 设备上只有 运行s。我还不确定这是否是我们应用程序的问题,或者这是否根本不可能。有谁知道使用 NDK API 级别 21 编译的应用程序是否有可能在旧 API 版本上编译到 运行?
这是一个很好的方法。
在平台实际附带 header 包含扩展的平台之前,您必须阅读和解析扩展规范才能生成这些内容。在 GLEW 等存在之前,我编写了一些 perl 代码,这些代码会为我需要的扩展吐出 headers。你总是可以这样做,但现在似乎没有必要,因为你可以直接从 Khronos here.
获得最新的 header如果扩展被列为已实现,请将其归结为 SDK 版本中的一个遗漏,并随时使用它。