【问题标题】:OpenGL ES: using Tegra specific extensions (GL_EXT_texture_array)OpenGL ES:使用 Tegra 特定的扩展 (GL_EXT_texture_array)
【发布时间】:2013-04-22 12:58:52
【问题描述】:

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

GL_EXT_texture_array

(详细信息: GL_EXT_texture_arary
我的 Tegra-3 设备 (Asus 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 中)似乎都不支持哪些?

提前致谢!

【问题讨论】:

    标签: android opengl-es-2.0 tegra


    【解决方案1】:

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

    GL_NV_texture_arrayGL_EXT_texture_array 非常相似,只是仅限于二维纹理数组。毫不奇怪,它使用许多与 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
    

    This version of gl2ext_nv.hGL_EXT_texture_array 定义了常量,但 notGL_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 一样使用该函数了。

    【讨论】:

    • 好的!这真的让我更清楚了。它似乎并不像我预期的那么难,但我不知道该怎么做。我只是在头文件中定义了新的常量,并使用函数指针来访问 GL_EXT_texture_array 提供的函数。代码编译,我现在可以在着色器端尝试这些东西,看看是否一切正常。所以,谢谢你的解释,这对我很有帮助! P.S.:是的,我通过glGetString(GL_EXTENSIONS)确定 Tegra 芯片的功能
    猜你喜欢
    • 2012-02-06
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多