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

#iphone #ios #ipad #opengl-es #opengl-es-2.0

#iPhone #iOS #iPad #opengl-es #opengl-es-2.0

Вопрос:

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

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

Ответ №1:

Согласно 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);
  

Комментарии:

1. Возможно, я что-то неправильно понимаю, но я думал, что GL_FLOAT указывает только формат ввода (то есть то, что передается).. и этот internalFormat (аргумент 3 для glTexImage) указал, как он хранится в памяти текстур. На моем ноутбуке, если я использую GL_RGB для internalFormat, я получаю сглаживание, но если я переключаюсь на GL_RGB16 или GL_RGB32F (т. е. 16/32 бита для каждого канала), сглаживание исчезает (оба используют GL_FLOAT для типа).

2. Я думаю, что, возможно, значения немного отклонились от их первоначального замысла на рабочем столе; по крайней мере, в ES внутренний формат используется только для того, чтобы различать, какие каналы вы предоставляете. Я нигде в спецификации ES не могу найти утверждения о том, что указанный формат ввода всегда будет учитываться графическим процессором, но могу сказать вам по опыту, что это будет на iOS с расширением float. Проект, из которого взят код, загружает одноканальную текстуру со значениями, которые охватывают 24-битный диапазон целых чисел, и я определенно получаю полный диапазон обратно в шейдер.

3. О, кроме того, я не могу найти немедленную окончательную ссылку на RGB / UNSIGNED_CHAR, равный 8: 8: 8, но вы можете видеть, что это неявно указано в официальных ответах на форуме, таких как devforums.apple.com/thread/94627?tstart=15

Ответ №2:

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