OpenGL ES: использование специальных расширений Tegra (GL_EXT_texture_array)

В настоящее время я разрабатываю приложение OpenGL-ES для Android с использованием NDK. Приложение получит большую пользу от следующего расширения 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), который содержит необходимое расширение. Но когда вы ищете его через Google, файл всегда является частью определенного проекта, а не чем-то официальным. Я также загрузил Tegra Android Development Pack (2.0), в который не включены ни этот файл заголовка, ни желаемое расширение.

Кто-нибудь может мне объяснить это, пожалуйста?
Как я могу использовать расширение Open-GL ES, поддерживаемое моим устройством Tegra-3, которое, по-видимому, не поддерживается какими-либо официальными заголовками Open-GL ES (в NDK)?

Заранее спасибо!


person Benjamin Kalloch    schedule 22.04.2013    source источник


Ответы (1)


Когда вы говорите, что ваше устройство Tegra 3 поддерживает GL_EXT_texture_array, но нет GL_NV_texture_array, я предполагаю, что вы определили это, позвонив в glGetString(GL_EXTENSIONS).

GL_NV_texture_array очень похож на GL_EXT_texture_array, но ограничен 2-мерными массивами текстур. Неудивительно, что он использует многие из тех же констант, что и 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

/ a> определяет константы для GL_EXT_texture_array, но не для 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.

person LightStruk    schedule 26.04.2013
comment
Хорошо! Это действительно прояснило мне ситуацию. Кажется, это не так сложно, как я ожидал, но я не знал, как это сделать. Я просто определил новые константы в файле заголовка и использовал указатель функции для доступа к функции, предоставляемой GL_EXT_texture_array. Код компилируется, и теперь я могу попробовать все на стороне шейдера, чтобы посмотреть, все ли работает. Итак, спасибо за ваше любезное объяснение, оно мне действительно помогло! P.S .: да, возможности Tegra Chip определяю по glGetString(GL_EXTENSIONS) - person Benjamin Kalloch; 26.04.2013