24

だから、私は詐欺師を持っています(実際の幾何学は立方体であり、おそらくクリップされており、詐欺師の幾何学はメンガースポンジです)そして私はその深さを計算する必要があります。

ワールドスペースでオフセットする量をかなり簡単に計算できます。残念ながら、私はそれで深さを混乱させることに失敗して何時間も費やしました。

私が得ることができる唯一の正しい結果は私が行くときです:

gl_FragDepth = gl_FragCoord.z

基本的に、次のことができるように、gl_FragCoord.zがどのように計算されるかを知る必要があります。

  • gl_FragCoord.zからアイスペースへの逆変換を行います
  • 深さの摂動を追加します
  • この摂動された深さを元のgl_FragCoord.zと同じ空間に変換し直します。

これが重複した質問のように思われる場合は、お詫び申し上げます。同様のことを扱っている他の投稿がここにたくさんあります。ただし、それらすべてを実装した後、正しく機能するものはありません。助けを得るために1つを選ぶのではなく、この時点で、私はそれを行う完全なコードを求めています。ほんの数行である必要があります。

4

2 に答える 2

36

今後の参考のために、キーコードは次のとおりです。

float far=gl_DepthRange.far; float near=gl_DepthRange.near;

vec4 eye_space_pos = gl_ModelViewMatrix * /*something*/
vec4 clip_space_pos = gl_ProjectionMatrix * eye_space_pos;

float ndc_depth = clip_space_pos.z / clip_space_pos.w;

float depth = (((far-near) * ndc_depth) + near + far) / 2.0;
gl_FragDepth = depth;
于 2012-10-15T21:11:40.617 に答える
7

別の将来の参考のために、これは、OpenGL4.0アプリケーションで私のために働いていたimallettによって与えられたものと同じ式です。

vec4 v_clip_coord = modelview_projection * vec4(v_position, 1.0);
float f_ndc_depth = v_clip_coord.z / v_clip_coord.w;
gl_FragDepth = (1.0 - 0.0) * 0.5 * f_ndc_depth + (1.0 + 0.0) * 0.5;

ここで、modelview_projectionは4x4 modelview-projection行列でありv_position、レンダリングされるピクセルのオブジェクト空間位置です(私の場合はレイマーチャーによって計算されます)。

方程式は、このマニュアルのウィンドウ座標セクションから得られます。私のコードでは、nearisとfarisは、のデフォルト値であることに注意してください。これは、透視投影行列の式の近距離/遠距離と同じではないことに注意してください。唯一のトリックは、andを使用することです(または実際に変更する必要がある場合)、私は他の深度範囲で1時間苦労していますが、それは私の(パースペクティブ)投影マトリックスですでに「ベイク」されています。0.01.0gl_DepthRangegl_DepthRange0.01.0gl_DepthRange

このように、方程式には実際には定数による1回の乗算((far - near) / 2)と別の定数の1回の加算()が含まれていることに注意してください(far + near) / 2。これを、imallettのコードで必要な乗算、加算、除算(最適化コンパイラによって乗算に変換される可能性があります)と比較します。

于 2015-04-01T17:40:18.880 に答える