如何在iOS中使用GL_HALF_FLOAT_OES类型的纹理?

我正在尝试创建一个浮动纹理来存储由片段着色器创建的渲染管道的中间结果。 我需要片段的值来签名浮点数

据我所知,所有新的iOS设备都应支持OES_texture_float扩展(即根据Apple指南从iPhone 3GS / iPod Touch 3 / iPad开始)。

但是,当我使用创建这样的纹理时

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

启动我的应用程序并在仪器中检查它,它告诉我:

glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,width,height,0,GL_RGB,GL_HALF_FLOAT_OES,NULL):(无效的枚举= 0x8d61):参数’type’的枚举无效

奇怪的是,它仍然在我的iPhone 4S上运行,但不适用于iPhone 4(也应该支持)。 但是,两个设备都会显示错误消息。 但是在iPhone 4上,OpenGL无法使用此纹理作为渲染目标来构建有效的帧缓冲对象。 在4S上运行得非常好。

你有什么建议我做错了吗?

谢谢!

一年后,我再次面临这个问题。 我做了一些研究,最后找到了解决方案:

在几乎所有的iOS设备上,都可以创建和使用float和half-float类型的纹理。 事实上,所有支持OES_texture_float扩展(或分别为OES_texture_half_float )的设备都允许创建浮点型纹理。

但是 ,如果您尝试使用Framebuffer对象渲染浮点型纹理,则设备也需要支持EXT_color_buffer_half_float扩展。 顾名思义,这个扩展允许将半浮点型纹理绑定到FBO的渲染目标。

现在事实certificate,只有拥有PowerVR SGX 543或554显卡的设备才支持此扩展,这些设备基本上都是在iPhone 4S之后(包括)发布的所有设备。 您可以参考Apple 针对iOS的OpenGL ES硬件平台指南,获取设备及其function列表。

概要:

如果要渲染为浮点型纹理,则需要检查设备是否支持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的附着点。)

我担心你没有做错任何事情, GL_HALF_FLOAT_OES仅支持iPhone4S和iPad2,尽管没有这方面的文档。 浮动纹理是一个巨大的性能杀手,甚至基本的方差阴影映射实现在iPhone4S上完全无法使用。