7

我需要 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);

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

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

4

2 回答 2

4

我不相信这对于浮动纹理是正确的。检查扩展文档:

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

它提到:

“选择的组按照 3.6.2 节中的描述进行处理,在最终扩展为 RGBA 后停止。如果纹理的内部格式是定点的,则将组件限制为 [0,1]。否则,不会修改值。 "

于 2012-12-20T18:52:18.200 回答
1

浮动纹理的全部内容是在着色器中支持 aprox [+inf,-inf]。您可以在这里找到更多有用的信息:在 iOS 下渲染到浮点纹理

于 2012-12-21T09:35:31.617 回答