Какой формат текстур OpenGL ES следует использовать для улучшения динамического диапазона на iPad?

Я разрабатываю программное обеспечение, которое использует карту текстур для хранения геометрии. Использование GL_RGB для внутреннего формата дает много алиасинга, я полагаю, потому что текстура по умолчанию сжимается до GL_RGB4.

На рабочем столе я могу использовать GL_RGB16 или GL_RGB32F (и т. д.) для установки внутреннего формата, но в OpenGL ES 2.0, похоже, нет ни одного из этих форматов. Есть ли альтернатива или расширение, доступное в IOS, которое я могу использовать?


person James Edge    schedule 18.04.2011    source источник


Ответы (2)


Согласно Apple (и моему собственному опыту), GL_RGB и GL_UNSIGNED_BYTE используют хранилище 8:8:8. Чтобы перейти к более низкой точности цвета, вам нужно указать тип GL_UNSIGNED_SHORT_5_6_5 или один из других типов, который упаковывает несколько каналов в один короткий.

Если, тем не менее, возникают проблемы с точностью, возможно, стоит проверить GL_OES_texture_float. и GL_OES_texture_half_float. Вы ограничены фильтрацией GL_NEAREST, но я полагаю, что вы все равно используете ее, поскольку это упражнение в хранении данных, и вы можете загружать свои исходные каналы с 16 или 32 битами на пиксель.

РЕДАКТИРОВАТЬ: пример использования взят непосредственно из проекта (который загружает 1-канальное/пиксельное изображение, но вы поняли):

GLfloat *integralImage;

/* <lots of stuff to allocate storage and fill integralImage here> */

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_LUMINANCE,
    256, 256, 0,
    GL_LUMINANCE, GL_FLOAT, 
    integralImage);
person Tommy    schedule 18.04.2011
comment
Возможно, я что-то неправильно понимаю, но я думал, что GL_FLOAT указывает только входной формат (то есть то, что передается) и что internalFormat (аргумент 3 для glTexImage) указывает, как он хранится в памяти текстуры. На моем ноутбуке, если я использую GL_RGB для внутреннего формата, я получаю псевдонимы, но если я переключаюсь на GL_RGB16 или GL_RGB32F (т. е. 16/32 бита для каждого канала), тогда псевдонимы исчезают (оба используют GL_FLOAT для типа). - person James Edge; 18.04.2011
comment
Я думаю, возможно, значения немного отклонились от их первоначального предназначения на рабочем столе; по крайней мере, в ES внутренний формат используется только для того, чтобы различать, какие каналы вы предоставляете. Я не могу найти нигде в спецификации ES утверждения о том, что указанный формат ввода всегда будет соблюдаться графическим процессором, но могу сказать вам по опыту, что это будет на iOS с расширением float. Проект, из которого взят код, загружает одноканальную текстуру со значениями, которые покрывают диапазон 24-битных целых чисел, и я определенно получаю полный диапазон обратно в шейдере. - person Tommy; 18.04.2011
comment
О, кроме того, я не могу найти немедленную окончательную ссылку на RGB/UNSIGNED_CHAR, равный 8:8:8, но вы можете видеть, что это неявно указано в ответах на официальном форуме, таких как devforums.apple.com/thread/94627?tstart=15 - person Tommy; 18.04.2011

Итак, после небольшого исследования вы можете получить плавающие текстуры (как упоминал @Tommy). Что вы не можете сделать, так это получить к ним доступ из вершинного шейдера под IOS, что делает невозможным их использование для хранения геометрии.

person James Edge    schedule 19.04.2011