Как использовать GL_HALF_FLOAT_OES типизированные текстуры в iOS? - PullRequest
10 голосов
/ 24 декабря 2011

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

Я понимаю, что существует расширение OES_texture_float , которое должно поддерживаться всеми новыми устройствами iOS (т.е. начиная с iPhone 3GS / iPod Touch 3 / iPad в соответствии с Руководством Apple ) .

Однако, когда я создаю такую ​​текстуру, используя

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_HALF_FLOAT_OES, NULL);

Запустите мое приложение и проверьте его в инструментах, оно говорит мне:

glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, ширина, высота, 0, GL_RGB, GL_HALF_FLOAT_OES, NULL): (недопустимое перечисление = 0x8d61): неверное перечисление для аргумента 'тип'

Любопытно, что он работает на моем iPhone 4S, но не на iPhone 4 (который также должен поддерживаться). Однако сообщение об ошибке появляется для обоих устройств. Но на iPhone 4 OpenGL не может построить действительный объект кадрового буфера, используя эту текстуру в качестве цели рендеринга. На 4S это прекрасно работает.

У вас есть предложения, что я делаю не так?

Спасибо!

Ответы [ 2 ]

8 голосов
/ 26 июня 2013

Через год я снова столкнулся с проблемой. Я провел небольшое исследование и, наконец, нашел решение:

Почти на всех устройствах iOS можно создавать и использовать текстуры типа float и half-float. Фактически все устройства, которые поддерживают расширение OES_texture_float (или OES_texture_half_float соответственно), позволяют создавать текстуры с плавающей точкой.

Однако , если вы пытаетесь отобразить в текстуру с плавающей запятой, используя объект Framebuffer, устройство должно также поддерживать расширение EXT_color_buffer_half_float. Как следует из названия, это расширение позволяет привязывать текстуры наполовину плавающего типа к цели рендеринга FBO.

Теперь выясняется, что это расширение поддерживается только на устройствах с графической картой PowerVR SGX 543 или 554, которые в основном являются всеми устройствами, выпущенными после (и включая) iPhone 4S. Вы можете обратиться к Apple Руководство по аппаратной платформе OpenGL ES для iOS для получения списка устройств и их возможностей.

Резюме:

Если вы хотите визуализировать текстуру с плавающей запятой, вам нужно проверить, поддерживает ли ваше устройство расширение EXT_color_buffer_half_float, и вам нужно создать текстуру с помощью

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_HALF_FLOAT_OES, NULL);

Если ваше устройство не поддерживает цветовые буферы наполовину с плавающей запятой, вы можете привязывать только текстуры беззнаковых байтов к вашему FBO:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

(Обратите внимание, что формат и внутренний формат текстуры (в данном случае GL_RGBA) зависит от точки подключения FBO.)

5 голосов
/ 15 марта 2012

Боюсь, вы ничего не делаете неправильно, GL_HALF_FLOAT_OES поддерживается только на iPhone4S и iPad2, несмотря на отсутствие документации по этому вопросу.Текстуры с плавающей точкой сильно снижают производительность, даже базовая реализация отображения теней для различий совершенно не работает на iPhone4S.

...