http://www.opengl.org/wiki/Rendering_Pipeline_Overviewは、ジオメトリシェーダが実行され、フラグメントがラスタライズされる前に、「表示ボリュームの内側と外側の境界にあるプリミティブが複数のプリミティブに分割されている」と述べています。私がOpenGLについて読んだことのあるものは、同じようにクリッピングプロセスについても説明しています。しかし、フラグメントシェーダのgl_FragDepthを、それを生成した三角形上のポイントの実際の深さよりもカメラに近い値に設定することで(固定小数点をコピーした場合にフラグメントがデプステストに合格するように、パイプラインの機能性)、私は、たとえそれが遠くの表示面と部分的に重なっていても、オリジナルの三角形全体に対してフラグメントが生成されていることを発見しています。一方、すべての頂点が平面の後ろにある場合は、三角形全体がクリップされ、フラグメントシェーダにフラグメントが送信されません(私は、それが切り捨てられ、切り捨てられないと言うよりも技術的にはそうです)。ジオメトリシェーダのOpenGLクリッププリミティブが、部分的にビューボリューム外にあるのはなぜですか?
ここでは何が起こっていますか?ジオメトリシェーダがデフォルトの機能を置き換えていますか?レンダリングパイプラインの次のステップで部分的なクリッピングを行う方法を知るために、書き込む必要のあるフラグやヒントが必要ですか?
私はNVIDIA GeForce 9400MでGL_EXT_geometry_shader4拡張機能を備えたGLSLバージョン1.2を使用しています。
ここで正しく私があなたを理解していることを確認したいだけです。クリッピングが発生したはずですが、フラグメントシェーダで深さの書き込みが発生します。それらがフラグメントシェーダに入ると、私は好きな深さの値を設定でき、私が期待するように動作します。予期せぬ動作は、最初にフラグメントシェーダに移動すべきでない事前処理されたフラグメントが、とにかくそこにあるということです。 – Kyle
私は、通常のパイプラインでは、クリッピングによって削除されるフラグメントは、クリッピングされていないと深さテストに失敗するため、破棄されても差がないことを理解しています(ただし、フラグメントプロセッサ用のものもあります)が、実際には深度値を変更したい場合がありますか?たとえば、深さに忠実な詐称者を作成するために必要です。 – Kyle
@ Kyle:遠くのクリッププレーンまたは近くのクリッププレーンと交差する深度で_and_を書くときにのみ問題が表示されるため、コーナーケースと呼んでいます。だから、あなたは近くに/遠くにぶつかり、深みのある執筆をする必要があります。とにかく、カメラの位置を合わせる傾向があるので、三角形が完全にビューの外側にあるか、まったくビューの外側にないかのどちらかです。その行動の理由はコメントには大きすぎるので、私は自分の答えを編集します。 –