Ответ 1
Через год я снова столкнулся с проблемой. Я провел некоторое исследование и, наконец, нашел решение:
На почти всех устройствах iOS можно создавать и использовать текстуры с плавающей точкой и полу-флоат-типом. Фактически все устройства, поддерживающие расширение OES_texture_float
(или OES_texture_half_float
, соответственно), позволяют создавать текстуры с плавающей запятой.
Однако, если вы пытаетесь отобразить текстуру с плавающей запятой, используя объект Framebuffer, устройству также необходимо поддерживать расширение EXT_color_buffer_half_float
. Как видно из названия, это расширение позволяет связывать текстуры с полуполяцией с объектом рендеринга FBO.
Теперь выясняется, что это расширение поддерживается только на устройствах с графической картой PowerVR SGX 543 или 554, которые в основном являются устройствами, выпущенными после (и включая) iPhone 4S. Вы можете ссылаться на Apple OpenGL ES Hardware Platform Guide для 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.)