1

http://www.opengl.org/wiki/Rendering_Pipeline_Overviewジオメトリシェーダーが実行された後、フラグメントがラスタライズされる前に、「表示ボリュームの内側と外側の境界にあるプリミティブがいくつかのプリミティブに分割される」と述べています。OpenGLについて私が今まで読んだ他のすべても、クリッピングプロセスを同じように説明しています。ただし、フラグメントシェーダーのgl_FragDepthを、それを生成した三角形上のポイントの実際の深度よりもカメラに近い値に設定することにより(固定をコピーした場合にフラグメントが失敗した場合に、フラグメントが深度テストに合格するように)パイプライン機能)、遠方の表示平面と部分的に重なっている場合でも、元の三角形全体に対してフラグメントが生成されていることがわかりました。一方、すべての頂点が平面の背後にある場合、

ここで何が起こっているのですか?私のジオメトリシェーダーはいくつかのデフォルト機能を置き換えますか?レンダリングパイプラインの次のステップで部分的なクリッピングを行う方法を知るために、設定する必要のあるフラグ/ヒント、または書き込む必要のある追加の組み込み変数はありますか?

NVIDIAGeForce9400MでGL_EXT_geometry_shader4拡張機能を備えたGLSLバージョン1.2を使用しています。

4

2 に答える 2

1

それはドライバーのバグのように聞こえます。表示領域の外側にあるはずのフラグメントの結果を確認できる場合(つまり、深度書き込みをオフにするとフラグメントが完全に消える場合)、それは仕様の動作に反します。

確かに、それは非常にコーナーケースであるため、誰もがそれについて何かをするつもりはないと思います。

ほとんどのグラフィックハードウェアは、実際に三角形がクリッピングされるのを避けるために、可能な限り努力します。三角形をクリップするということは、1つの三角形から3つ以上の三角形を生成する可能性があることを意味します。これはパイプラインを詰まらせる傾向があります(とにかく事前テッセレーション)。したがって、三角形が自明に拒否可能(つまり、クリップボックスの外側)または信じられないほど大きい場合を除いて、最新のGPUはそれを無視します。彼らはフラグメントカリングハードウェアにそれを処理させました。

この場合、フラグメントシェーダーは深度書き込みシェーダーであるため、フラグメントシェーダーが終了するまで、これらのフラグメントを拒否できないと考えられます。


注:デプスクランプをオンにすると、ニアクリッピングとファークリッピングが完全にオフになることに気付きました。どちらがあなたが望むものかもしれません。フラグメントシェーダーから書き込まれた深度値は、現在のにクランプされglDepthRangeます。

デプスクランプはOpenGL3.2の機能ですが、NVIDIAはNV_depth_clampを使用して10年近くサポートしてきました。また、ドライバーが最近のものである場合は、3.2互換性コンテキストを取得していなくても、ARB_depth_clampを使用できるはずです。

于 2011-08-02T00:48:19.720 に答える
-1

私があなたを正しく理解していれば、あなたはあなたの三角形が遠い平面に対してクリップされていないのではないかと思います。
Afaik OpenGLは、頂点アセンブリの後に4つの境界面に対してクリップします。フラグメントシェーダーの後で、遠近のクリッピングが(spec afaikによって)実行されます。つまり、極端にズームインしてポリゴンがニアプレーンと衝突すると、ポリゴンはそのポイントにレンダリングされ、全体として飛び出しません。
そして、スペックがプリミティブの分割をまったく指摘していないと思います(hwがfragdepthを無視して画面空間でそれを行う可能性がある場合でも)、プリミティブ全体をスキップすることを指摘しているだけです(ビュー錐台に頂点がない場合)。
また、単語の正確なルールをwikiに依存することは、常に悪い考えです。

PS:http ://fgiesen.wordpress.com/2011/07/05/a-trip-through-the-graphics-pipeline-2011-part-5/は、実際の境界線と近距離および遠距離のクリッピングについて非常によく説明しています。

于 2011-08-02T03:38:06.433 に答える