2

現在、opengl-esを使用しており、glシェーディング言語を使用しています。テクスチャにレンダリングしたいのですが、精度が低下していることがわかりました。たとえば、フロート値0.5をテクスチャに書き込むと、テクスチャに格納されている実際の値は約0.498であることがわかりました。より高い精度を達成するにはどうすればよいですか?

4

4 に答える 4

1

おそらく、値のパック-アンパックを介して値を保存することを検討する必要があります(ピクセル/テクセルごとに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 に答える
1

変数の前に highp 精度修飾子を追加してみてください。

于 2012-10-22T05:30:21.537 に答える
1

コンポーネントごとに 8 ビット以上を使用するテクスチャにレンダリングします。そのための適切なOpenGL ES拡張機能がない場合、通常、できることはあまりありません。

于 2012-10-22T05:30:23.607 に答える
1

レンダリング パイプラインの最終段階では、ピクセル値が 0..1 の範囲 (終点を含む) にスケーリングされるため、次に高い精度でも十分ではない可能性があります。したがって、1 は 255 として表され、1/256 ではなく 1/255 の係数を示唆します。

同じことがすべての精度に適用されます。0.5 は正確に表現できません。

于 2012-10-22T05:40:29.443 に答える