私はWebGLでシャドーマッピングを勉強しようとしています。私は、これを実現するさまざまなライブラリとサンプルでコピーされた同じシェーダコードを参照しています。しかし、私はそれがどのように機能するかの説明を見つけることができませんでした。floatをvec4にパッキング - このコードはどのように機能しますか?
アイデアは、カラーバッファ(vec4)に深度値(単一の浮動小数点数)を保存することです。 float to vec4を保存するpack関数と、vec4からfloatを取得するunpack関数があります。
vec4 pack_depth(const in float depth)
{
const vec4 bit_shift = vec4(256.0*256.0*256.0, 256.0*256.0, 256.0, 1.0);
const vec4 bit_mask = vec4(0.0, 1.0/256.0, 1.0/256.0, 1.0/256.0);
vec4 res = fract(depth * bit_shift);
res -= res.xxyz * bit_mask;
return res;
}
float unpack_depth(const in vec4 rgba_depth)
{
const vec4 bit_shift = vec4(1.0/(256.0*256.0*256.0), 1.0/(256.0*256.0), 1.0/256.0, 1.0);
float depth = dot(rgba_depth, bit_shift);
return depth;
}
私はちょうどvec4の4つのスロットのいずれかにコピーして使用されていない他の人を残して、vec4にフロートを梱包することは些細な問題であることを想像しただろう。そのため、上記のコードのビットシフトロジックが私に困惑しています。
誰でも光を当てることはできますか?
です。私にはvec4を供給してもカラーバッファは内部的に4つの整数としてカラー値を内部に格納することは私には明らかではありませんでした。そうであれば、上記のコードは理にかなっています。ありがとう。 – Jayesh
厳密に言えば、浮動小数点数ではなく32ビットの固定小数点数に変換されます。 – Mortennobel