2012-04-22 3 views
17

私は詐欺師です(実際のジオメトリは立方体で、おそらくクリップされ、詐欺師のジオメトリはメンガーのスポンジです)、その深さを計算する必要があります。GLSL gl_FragCoord.z計算と設定gl_FragDepth

私はかなり簡単にワールド空間でオフセットする量を計算することができます。残念ながら、私はそれで深さを乱すことに時間を費やしました。私が行くとき

私が得ることができる唯一の正しい結果は以下のとおりです。逆変換を取る

  • gl_FragDepth = gl_FragCoord.z 
    

    は基本的に、私は私ができるようにgl_FragCoord.zを計算する方法を知っておく必要がありますgl_FragCoord.zから目の空間へ

  • 深度の摂動を追加
  • この摂動深度を元のgl_FragCoord.zと同じ空間に戻します。

重複した質問のように思われる場合はお詫び申し上げます。同じようなことに対処する多くの他の記事がここにあります。しかし、それらのすべてを実装した後は、正しく動作しません。助けを求めるために1つを選ぶのではなく、この時点で、私はそれを行う完全なコードを求めています。それはちょうど数行でなければなりません。将来の参照のため

+0

頂点シェーダーも作成しましたか?またはフラグメントシェーダーのみ? –

+2

私は一般的な原則でコードを提供するつもりはありませんが、[OpenGL Wikiへのこのリンク](http://www.opengl.org/wiki/Compute_eye_space_from_window_space)を教えてください。同様にこれを行う方法を示す詐欺師と深度に関する私のチュートリアルへのリンク(http://www.arcsynthesis.org/gltut/Illumination/Tut13%20Deceit%20in%20Depth.html)。深さを元に戻すのは簡単です。 –

+0

マイケル:はい、それはちょうど通過シェーダです。それが起こると、計算は世界の空間で行われるので、フラグメントプログラムで視空間を計算できます。 ニコル、私はすでにそのページを見ていました。私はそれを次のように実装します: vec4 clip_pos = gl_ProjectionMatrix * vec4(eye_pos、1.0); float ndc_depth = clip_pos.z/clip_pos.w; gl_FragDepth =(((clip_far-clip_near)* ndc_depth)+ clip_near + clip_far)/ 2.0; 残念ながら、オフセットがないにもかかわらず、奥行きが奥行き範囲外にあるように見えます。 ありがとう、 – imallett

答えて

28

は、キーコードが別の将来の参照のため

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; 
+0

"gl_DepthRange.far"と "gl_DepthRange.near;"クリッププレーンの値ではなく、投影行列の近範囲と遠範囲で置き換えることができますか? – Tara

+0

全くありません。 gl_DepthRangeは、投影行列を計算するために使用された近平面値および遠平面値と同じではありません。私はあなたの意見を誤解しているかもしれません。 – Tara

+0

@Dudesonクリッププレーンは、どの値がNDCの外側にマッピングされるか(したがって、ハードウェアによってクリップされる)の投影行列を単純に決定します。射影行列が指定された後、私たちは完全に完了しました。一方、 'gl_DepthRange。(ne | f)ar'は深度バッファの範囲であり、NDCから深度バッファに変換するために必要です。 HTH – imallett

4

、これは、OpenGL 4.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モデルビュー投影行列であり、v_positionは、レンダリングされるピクセルのオブジェクト空間位置です(私の場合は、raymarcherによって計算されます)。

この式は、window coordinatesセクションのthis manualから得られます。私のコードでは、nearは0.0で、farは1.0であり、デフォルト値はgl_DepthRangeです。 gl_DepthRangeではなく、と近距離/遠距離と同じものがperspective projection matrixの式にあります。唯一のトリックは、0.01.0(または実際には変更が必要な場合はgl_DepthRange)を使用していますが、私は他の深度範囲で1時間苦労していますが、それはすでに私の(透視投影)マトリックス。

このように、方程式は実際には定数((far - near)/2)と別の定数((far + near)/2)の1つの加算による単なる乗算を含みます。これをimallettのコードで必要とされる乗算、加算、除算(おそらく最適化コンパイラによって乗算される)と比較してください。

関連する問題