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

前端之家收集整理的这篇文章主要介绍了如何在iOS中使用GL_HALF_FLOAT_OES类型的纹理?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图创建一个浮点纹理来存储由片段着色器创建的渲染管道的中间结果.我需要片段的值被签名的浮点数.

我了解到,所有新的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的附件点.)

原文链接:https://www.f2er.com/iOS/329966.html

猜你在找的iOS相关文章