2

我现在使用 opengl-es 并且使用 gl 着色语言。我希望渲染到纹理,但我发现精度下降。例如,当我将浮点值 0.5 写入纹理时,我发现存储在纹理中的实际值约为 0.498。我应该怎么做才能达到更高的精度?

4

4 回答 4

1

尝试在变量前面添加 highp 精度限定符。

于 2012-10-22T05:30:21.537 回答
1

渲染到每个组件使用超过 8 位的纹理。如果您没有相应的OpenGL ES扩展,那么您通常无能为力。

于 2012-10-22T05:30:23.607 回答
1

即使是下一个更高的精度也可能不够,因为渲染管道的最后阶段会将像素值缩放到 0..1 的范围,包括端点。因此 1 将表示为 255,这表明因子是 1/255 而不是 1/256。

这同样适用于所有精度:0.5 不能准确表示。

于 2012-10-22T05:40:29.443 回答
1

您可能应该考虑通过打包-解包您的值来存储您的值(如果每个像素/纹素只有一个值):

vec4 packFloat(const float value) {
    const vec4 bitSh = vec4(256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0);
    const vec4 bitMsk = vec4(0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0);
    vec4 res = fract(value * bitSh);
    res -= res.xxyz * bitMsk;
    return res;
}

float unpackFloat(const vec4 value) {
    const vec4 bitSh = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);
    return (dot(value, bitSh));
}

这对于存储深度图之类的值可能没问题,这对于每个像素/纹素来说是一种 32 位范围

于 2012-10-22T22:06:45.113 回答