我正在尝试创建一个浮动纹理来存储由片段着色器创建的渲染管道的中间结果。我需要片段的值为 signed floats 。
据我所知,所有新iOS设备都应支持OES_texture_float扩展名(例如,根据Apple guide从iPhone 3GS / iPod Touch 3 / iPad开始)。
然而,当我使用
创建这样的纹理时glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_HALF_FLOAT_OES, NULL);
启动我的应用程序并在Instruments中检查它,它告诉我:
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上运行得非常好。
你有什么建议我做错了吗?
谢谢!
答案 0 :(得分:8)
一年后,我再次遇到问题。我做了一些研究,最后找到了解决方案:
在几乎所有的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 for 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的附着点。)
答案 1 :(得分:5)
我担心你没有做错任何事,只有iPhone4S和iPad2支持GL_HALF_FLOAT_OES
,尽管没有这方面的文档。浮动纹理是一个巨大的性能杀手,甚至基本的方差阴影映射实现在iPhone4S上完全无法使用。