在iOS上的OpenGL ES 2.0中浮点纹理而不将它们钳制到[0,1]

Ray*_*eeA 7 opengl-es glsl ios opengl-es-2.0 ios6

我需要gl_FragColor来"绘制"浮点值,它也可以是负值(x <0)和> 1.0.然后,我想使用FBO的颜色附件,这个值在渲染时使用,并将其用作另一个FBO中的纹理.现在我已经阅读http://www.khronos.org/opengles/sdk/docs/man/(GlTexImage2D下),所有值都被限制在[0,1]的范围内,而且我没有找到glClampColor指令.有没有可能在这里找到一个解决方法,或者有人有一个想法可以帮助我解决我的问题?:)

解决了

当使用浮点纹理时,可能并且值根本不会被钳制到[0,1],但它只能使用GL_HALF_FLOAT_OES作为纹理的内部格式.使用GL_FLOAT会导致一个不完整的帧缓冲对象,这真的很难过,因为我正在构建一个求和区域表(SAT)并且在这里遇到了很大的精度问题.所以一般来说,iPad2上只支持半精度(2个字节,1个符号位+ 5个指数位+ 10个分数)浮点数.

工作创建FBO的颜色附件纹理

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_HALF_FLOAT_OES, NULL);
Run Code Online (Sandbox Code Playgroud)

还有一件事要提到:仪器将报告"无效枚举参数'类型'"消息,但无论如何它确实有效.此外,模拟器将使用全精度纹理而不是指定的半精度(我认为因为C中没有这样的数据类型).这就是为什么你可以在模拟器上获得较少的精度问题.

但最令人困惑的是打印glGetString(GL_EXTENSIONS)时支持"GL_OES_texture_float".但是如前所述,它不起作用.

Tar*_*ark 4

我不相信浮动纹理是这样。检查扩展文档:

http://www.khronos.org/registry/gles/extensions/OES/OES_texture_float.txt

它提到:

“所选组的处理方式如第 3.6.2 节中所述,在最终扩展为 RGBA 后停止。如果纹理的内部格式是定点的,则组件将被限制为 [0,1]。否则,不会修改值。 ”