【问题标题】:Using GL_EXT_color_buffer_half_float with Android NDK在 Android NDK 中使用 GL_EXT_color_buffer_half_float
【发布时间】:2015-03-06 00:48:20
【问题描述】:

我正在尝试将 GL_EXT_color_buffer_half_float OpenGL ES 2.0 扩展与原生 Android NDK 应用程序一起使用。 OpenGL ES 2.0 扩展在<GLES2/gl2ext.h> 标头中定义。问题是 GL_EXT_color_buffer_half_float 扩展在 Android API 级别 21** 之前未在 <GLES2/gl2ext.h> 标头中定义,这对应于 Android 5.0 “Lollipop”。以前版本的标头未定义 GL_EXT_color_buffer_half_float 扩展名,因此当我尝试针对较早的 API 级别(如 10 或 14)进行编译时,我会收到未声明的标识符错误:

error: use of undeclared identifier 'GL_RGBA16F_EXT'

如果我从 API 级别 21 转到 <GLES2/gl2ext.h> 标头并复制 GL_EXT_color_buffer_half_float 扩展并将其放入我自己的标头中:

#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> 标头中未包含但操作系统/设备支持的 OpenGL 扩展的“正确”方法是什么?

**注意:我尝试使用 API 级别 21 编译我们的应用程序,但是当我这样做时,应用程序无法在旧设备(Android 4.4,API 级别 20)上运行。它仅在 Android 5.0 设备上运行。我还不确定这是否是我们的应用程序的问题,或者这甚至是不可能的。有谁知道使用 NDK API 级别 21 编译的应用是否可以在较旧的 API 版本上运行?

【问题讨论】:

  • 不,使用 NDK API 级别 21 构建的应用程序很可能无法在旧设备上运行,而在早期版本上它应该可以正常工作(只要您不使用仅存在于较新设备中的功能)版本)。有关该问题的更多信息,请参阅stackoverflow.com/questions/27338318

标签: android opengl-es android-ndk precision


【解决方案1】:

这是一个很好的方法。

在平台实际发布包含扩展的标头之前,您必须阅读和解析扩展规范才能生成这些内容。在 GLEW 等存在之前,我编写了一些 perl 代码,这些代码会为我需要的扩展提供标头。您总是可以这样做,但是现在您可以直接从 Khronos here 获取最新的标头,这似乎是不必要的。

如果该扩展被列为已实现,请将其归结为 SDK 版本中的一个遗漏,并且无论如何都可以随意使用它。

【讨论】:

  • 谢谢,我不知道 OpenGL 扩展的约定是什么。
猜你喜欢
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
相关资源
最近更新 更多