3

我目前正在使用 NDK 为 Android 开发 OpenGL-ES 应用程序。该应用程序将极大地受益于以下 Open-GL 扩展:

GL_EXT_texture_array

(详细信息:GL_EXT_texture_arary
我的 Tegra-3 设备(华硕 EeePad Transformer Prime Tf-201)支持该扩展

我现在面临的问题是,我不知道如何使扩展程序可用于我的应用程序,因为它不包含在 Open-GL ES API 注册表中。
(请参阅“扩展规范”:http ://www.khronos.org/registry/gles/ )
但是我注意到一个名为“GL_NV_texture_array”的扩展,它似乎具有相同的用途,但我的 Tegra-3 设备不支持.

我知道使用函数指针包含扩展的可能性。但我认为可能有更舒适的方式。我还找到了一个头文件 (gl2ext_nv.h),其中包含必要的扩展名。但是当你通过谷歌搜索它时,该文件总是特定项目的一部分,而不是官方的。我还下载了 Tegra Android Development Pack (2.0),其中既不包含此头文件,也不包含所需的扩展名。

谁能给我解释一下,好吗?
如何使用我的 Tegra-3 设备支持的 Open-GL ES 扩展,而任何官方 Open-GL ES 特定标头(在 NDK 中)似乎都不支持这些扩展?

提前致谢!

4

1 回答 1

2

当您说您的 Tegra 3 设备支持GL_EXT_texture_array GL_NV_texture_array支持时,我假设您通过调用glGetString(GL_EXTENSIONS).

GL_NV_texture_array与 非常相似GL_EXT_texture_array,仅限于 2d 纹理数组。毫不奇怪,它使用许多与 GL_EXT_texture_array 相同的常量,只是名称不同。

GL_NV_texture_array

TEXTURE_2D_ARRAY_NV                             0x8C1A
TEXTURE_BINDING_2D_ARRAY_NV                     0x8C1D
MAX_ARRAY_TEXTURE_LAYERS_NV                     0x88FF
FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_NV         0x8CD4
SAMPLER_2D_ARRAY_NV                             0x8DC1

GL_EXT_texture_array

TEXTURE_2D_ARRAY_EXT                            0x8C1A
TEXTURE_BINDING_2D_ARRAY_EXT                    0x8C1D
MAX_ARRAY_TEXTURE_LAYERS_EXT                    0x88FF
FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT        0x8CD4
SAMPLER_2D_ARRAY_EXT                            0x8DC1

这个版本的 gl2ext_nv.h定义了常量 forGL_EXT_texture_array不是for GL_NV_texture_array,所以也许 nVidia 现在使用旧名称。如果您找不到更新版本的标头,只需包含此标头即可。

要访问 GL 扩展提供的函数,请使用eglGetProcAddress将函数分配给函数指针。

// The function pointer, declared in a header.
// You can put this in a class instance or at global scope.
// If the latter, declare it with "extern", and define the actual function
// pointer without "extern" in a single source file.
PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC glFramebufferTextureLayerEXT; 

在检查是否存在 GL_EXT_texture_array 扩展的函数中,如果找到,则获取函数的地址并将其存储在函数指针中。对于 OpenGL-ES,这意味着询问 EGL:

glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) eglGetProcAddress("glFramebufferTextureLayerEXT");

现在您可以像使用常规 OpenGL 的一部分一样使用该函数。

于 2013-04-26T03:46:13.333 回答