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

如何在iOS中使用GL_HALF_FLOAT_OES类型的纹理?,ios,opengl-es,floating-point,textures,Ios,Opengl Es,Floating Point,Textures,我试图创建一个浮动纹理来存储由片段着色器创建的渲染管道的中间结果。我需要将片段的值作为有符号浮点 据我所知,所有新的iOS设备都应支持此扩展(即,从iPhone 3GS/iPod Touch 3/iPad开始,根据标准) 但是,当我使用 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_HALF_FLOAT_OES, NULL); 启动我的应用程序并在Instruments中检查,它告诉我: GLTEXAGE

我试图创建一个浮动纹理来存储由片段着色器创建的渲染管道的中间结果。我需要将片段的值作为有符号浮点

据我所知,所有新的iOS设备都应支持此扩展(即,从iPhone 3GS/iPod Touch 3/iPad开始,根据标准)

但是,当我使用

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_HALF_FLOAT_OES, NULL);
启动我的应用程序并在Instruments中检查,它告诉我:

GLTEXAGE2D(GL_纹理_2D,0,GL_RGB,宽度,高度,0,GL_RGB,GL_半浮点数,NULL):(无效枚举=0x8d61):参数“类型”的枚举无效

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

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


谢谢

恐怕您没有做错什么,
GL_HALF_FLOAT_OES
仅在iPhone4S和iPad2上受支持,尽管没有相关文档。浮动纹理是一个巨大的性能杀手,即使是基本的方差阴影映射实现在iPhone4S上也完全无法使用。

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

在几乎所有的iOS设备上,都可以创建和使用浮点和半浮点类型的纹理。事实上,所有支持
OES_纹理_浮点
扩展(或
OES_纹理_半浮点
)的设备都允许创建浮点类型的纹理

但是如果您试图使用帧缓冲区对象渲染成浮点类型的纹理,设备还需要支持
EXT\u color\u buffer\u half\u float
扩展。顾名思义,此扩展允许将半浮点数类型的纹理绑定到FBO的渲染目标

现在看来,这种扩展只在配备PowerVR SGX 543或554图形卡的设备上受支持,这些设备基本上都是在iPhone 4S之后(包括iPhone 4S)发布的设备。你可以参考苹果的设备及其功能列表

总结: 如果要渲染到浮点类型的纹理,需要检查设备是否支持
EXT\u color\u buffer\u half\u 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的附着点。)

这很遗憾,但我想你是对的。顺便说一句,即使在iPhone4S/iPad2上,我也会遇到上面提到的OpenGL错误。但它是有效的,尽管。。。对我来说,性能(速度方面)与字节类型纹理相同。只是内存消耗是原来的两倍。请注意:新的iPad(第三代)也可以处理浮点型纹理。嘿,你能渲染成单通道浮点纹理吗?代码如下所示:“glTexImage2D(GL_纹理_2D,0,GL_红色_外部,宽度,高度,0,GL_红色_外部,GL_一半浮动_OES,NULL);”我无法获得输出。它表示FBO不完整。如果您的设备支持扩展名
EXT\u texture\u rg
(除了
EXT\u color\u buffer\u half\u float
),您应该能够将单通道float纹理绑定到FBO。对我来说,它适用于双通道浮点(
glTexImage2D(GL\u TEXTURE\u 2D,0,GL\u RG\u EXT,width,height,0,GL\u RG\u EXT,GL\u HALF\u FLOAT\u OES,NULL)
)和单通道无符号字节纹理。谢谢你的回复。我让半浮子工作了。正如您所说的,GLTEXAGE2D(GL_纹理_2D,0,GL_红色_外接,宽度,高度,0,GL_红色_外接,GL_半浮动_外接,NULL)。从iPhone4S开始,所有设备上都可以使用此功能。现在,我坚持使用浮动纹理。glTexImage2D(GL_纹理_2D,0,GL_红色_外部,宽度,高度,0,GL_红色_外部,GL_浮动,NULL),但这不起作用。我的帧缓冲区不完整。