我了解到,所有新的iOS设备都应该支持OES_texture_float扩展功能(即从iPhone 3GS / iPod Touch 3 / iPad根据Apple guide开始).
但是,当我创建这样一个纹理
glTexImage2D(GL_TEXTURE_2D,GL_RGB,width,height,GL_HALF_FLOAT_OES,NULL);
开始我的应用程序并在仪器中检查它,它告诉我:
glTexImage2D(GL_TEXTURE_2D,NULL) : (invalid enum=0x8d61): Invalid enum for argument ‘type’
好奇的是,它仍然在我的iPhone 4S上工作,但不是在iPhone 4上(也应该被支持).但是,出现这两个设备的错误信息.但是在iPhone 4中,OpenGL无法使用此纹理作为渲染目标构建一个有效的framebuffer对象.在4S上,效果很好.
你有什么建议我做错了吗?
谢谢!
解决方法
在几乎所有的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,GL_RGBA,NULL);
如果您的设备不支持半浮点颜色缓冲区,则只能将无符号字节类型的纹理绑定到FBO:
glTexImage2D(GL_TEXTURE_2D,GL_UNSIGNED_BYTE,NULL);
(请注意,纹理的格式和内部格式(本例中为GL_RGBA)取决于FBO的附件点.)