2012-03-27 11 views
19

私は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にフロートを梱包することは些細な問題であることを想像しただろう。そのため、上記のコードのビットシフトロジックが私に困惑しています。

誰でも光を当てることはできますか?

答えて

12

GLSL floatをGLSL vec4に保存していません。それは、vec4の値をRGBA8フレームバッファ(32ビット値)に書き込んだときにvec4として読み取られ、以前に与えられた同じfloatに再構成される値を格納することです。

浮動小数点値をフレームバッファの赤いチャネルに書き込むだけであれば、8ビットの精度しか得られません。この方法では、すべての32ビットが機能します。

+0

です。私にはvec4を供給してもカラーバッファは内部的に4つの整数としてカラー値を内部に格納することは私には明らかではありませんでした。そうであれば、上記のコードは理にかなっています。ありがとう。 – Jayesh

+0

厳密に言えば、浮動小数点数ではなく32ビットの固定小数点数に変換されます。 – Mortennobel

3

上記の回答に加えて、あなたはここで説明する浮動小数点テクスチャの拡張に興味があるかもしれない:

http://www.khronos.org/registry/webgl/extensions/OES_texture_float/

注意この拡張が存在しない場合、ハードウェア/ソフトウェアのセットアップがそこにあること/実行しますが、そうであれば確かに良い拡張子です。私の経験は、それが速いということです。これを使用すると、残りの3つのチャンネルを使用して、投影されたテクスチャからの色などの他の情報を保存することができます。

2

これらのルーチンがどのように機能するかについての詳細は、my blog postを読むことをお勧めします。そのコードがどのように動作するかについていくつかの詳細を追加し、いくつかの可能なユースケースに取り組んでいます。

おそらくわかるように、そのコードは正規化されたfloat値をvec4にエンコードしています。 OpenGL ES 2.0またはWebGL(執筆時点で)は、RGBA8テクスチャ(more on this in the spec)を介して32ビット精度の浮動小数点を提供するために、これらのパック/アンパックルーチンを利用するかもしれません。完全な32ビット精度浮動小数点を正規化し、スペックreadPixelsに記載されているようにダンプするミカエル(OES_texture_float)が(例えば、デバッグ用)が必要かもしれないが掲示する拡張は、現在、以下の

によって制限されていてもして

フォーマットとタイプの2つの組み合わせのみが受け入れられます。最初の形式はRGBA形式でUNSIGNED_BYTEと入力します。 2番目は実装が選択した形式です。

関連する問題