Через год я снова столкнулся с проблемой. Я провел небольшое исследование и, наконец, нашел решение:
Почти на всех устройствах 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.)