2

頂点フラグメントシェーダーペアの内部で何が起こるかを理解しようとしています。具体的には、CPUの深度値を比較しようとしています。これらの深度値のうち、シェーダーによって計算され、gl_FragCoord.z値に対応します。私が知っているのは、深度出力が[0,1]の範囲にあり、線形ではないということです。では、頂点シェーダーに深度をフィードしてからフラグメントシェーダーで読み取るまでの間に、特定の深度値がどうなるかを誰かが知っていますか?openglはどのようにして深度を[0,1]の範囲に変換しますか?

よろしくお願いします!

4

2 に答える 2

3

行列変換を適用した後、次の[v]条件を満たす場合、頂点は正規ビュー ボリューム内にあります。

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

(w) によるパースペクティブ除算後:

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

深度値の正規化された範囲 [0, 1] は、次の式で与えられます。

depth = 0.5 * (z' + 1.0)
于 2011-11-08T12:25:24.463 に答える
2

シンプルな 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] へのマッピングを処理します。これは、ビューポートの情報を持っている (少なくとも持っている必要がある) ためです。

于 2011-11-08T11:30:52.453 に答える