#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, что делает невозможным их использование для хранения геометрии.