2011-11-08 17 views
2

私は、頂点とフラグメントのシェーダのペアで内部的に何が起こるかを調べようとしています。より具体的には、私は、CPUの深さの値を比較しようとしています。これらの深度値のオンはシェーダによって計算され、gl_FragCoord.zの値に対応します。 私が知っていることは、奥行き出力が[0,1]の範囲にあり、線形ではないことです。頂点シェーダーに深さを与えてからフラグメントシェーダーでそれを読み取るまでの間に、どんな深さの値にも何が起こるかを知っていますか? OpenGLは深さを[0,1]の範囲にどのように変換しますか?OpenGLシェーダのパイプラインの深さの計算

ありがとうございます!

答えて

1

単純なOpenGLレンダラでは、頂点シェーダのマトリックス変換によって深度値が生成されます。私の場合、基本的な頂点シェーダは次のようになります。

mat4 mvpMatrix = ProjectionMatrix * ViewMatrix * ModelMatrix; 
vec4 pos = vec4(ObjectPosition.x, ObjectPosition.y, ObjectPosition.z, 1.0); 

gl_Position = mvpMatrix * pos; 

入力として機能する3つのマトリックスは、私のアプリケーションによって制御されます。私はそれらを完全に制御していて、私が望むならば手作業で作業することができます。

要約:頂点シェーダに送信する行列を計算して計算します。変換は頂点シェーダ自体で行われ、最も重要な行列はおそらくProjectionMatrixにあります。ビューポートの知識があるため(少なくとも必要です)、[0,1]へのマッピングが処理されます。それが満たす場合

1

マトリックス変換を適用した後、頂点[v]はカノニカルビューボリュームである:

-1 <= x' <= 1, -1 <= y' <= 1, -1 <= z' <= 1 (where: x' = v.x/v.w, etc.) 

正規化範囲[0:

- v.w <= v.x <= v.w, - v.w <= v.y <= v.w, - v.w <= v.z <= v.w 

(W)によって透視分割後、1]は次式で与えられる。

depth = 0.5 * (z' + 1.0) 
関連する問題