現在、opengl-esを使用しており、glシェーディング言語を使用しています。テクスチャにレンダリングしたいのですが、精度が低下していることがわかりました。たとえば、フロート値0.5をテクスチャに書き込むと、テクスチャに格納されている実際の値は約0.498であることがわかりました。より高い精度を達成するにはどうすればよいですか?
質問する
1339 次
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
レンダリング パイプラインの最終段階では、ピクセル値が 0..1 の範囲 (終点を含む) にスケーリングされるため、次に高い精度でも十分ではない可能性があります。したがって、1 は 255 として表され、1/256 ではなく 1/255 の係数を示唆します。
同じことがすべての精度に適用されます。0.5 は正確に表現できません。
于 2012-10-22T05:40:29.443 に答える