GLSL片段着色器中的精度损失

时间:2012-10-22 05:25:57

标签: opengl-es opengl-es-2.0 glsl

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

4 个答案:

答案 0 :(得分:1)

渲染到每个组件使用8位以上的纹理。如果您没有appropriate OpenGL ES extensions for that,那么通常您无能为力。

答案 1 :(得分:1)

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

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

答案 2 :(得分: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位范围

答案 3 :(得分:0)

尝试在变量前添加highp precision限定符。