すべての描画を効果的に無効に設定glStencilFunc( GL_NEVER, . . . )
し、[シェーダーにバインドされた] プログラムを実行すると、フラグメント シェーダーを実行するよりもパフォーマンスが向上しません。ステンシル テストはフラグメント プログラムの前に行われたと思いました。そうではありませんか、少なくとも保証されていませんか?gl_FragColor に定数を書き込むだけのフラグメント シェーダーに置き換えると、FPS が高くなります。
4 に答える
それは実際には両方のビットです。このOpenGL ES 2.0 パイプライン図でわかるように、フラグメントごとの操作はフラグメント プログラムの後に行う必要があります。ただし、最新のグラフィック カードの多くには、フラグメント シェーダーの深さまで書き込まない限り、フラグメントを早期に破棄する初期の z テストがあります。
これは、AMD/ATI の論文で、そのようなテストについて述べています。仕様では、シェーダーが後で行うのと同じ結果を生成する前に実行する限り、初期のテストが許可されていることを読んだことを覚えています。これが、深さを変更したり、シェーダーでフラグメントを破棄したくない理由です。OpenGL フォーラムのこのスレッドには、それに関する興味深い議論があります。
フラグメント深度の変更に加えて、フラグメント シェーダーの前に深度/ステンシル テストが行われないようにするいくつかの要因があります。Z 書き込みが有効になっている場合、アルファテストやdiscard
シェーダー命令など、シェーダーでフラグメントを中止する方法はすべてこれを行います。
GPU が z/stencil 書き込みと同じ操作で stencil/z テストを実行したい場合、フラグメント シェーダーが実行されるまで待機して、フラグメントが z-buffer に書き込むことが許可されていることを認識する必要があります。ただし、これはカードによって異なる場合があります。少なくとも、それが現在の問題であるかどうかは簡単にわかるはずです。
DX10パイプラインの次の概要を見てください。これは、ステンシルテストがピクセルシェーダーの前に実行されることを示しています。
DX11でも同じことが言えます。
http://4.bp.blogspot.com/_2YU3pmPHKN4/S1KhDSPmotI/AAAAAAAAAcw/d38b4oA_DxM/s1600-h/DX11.JPG
これがOpenGL仕様で義務付けられているかどうかはわかりませんが、フラグメントプログラムを実行する前にステンシルテストを実行しないことは、実装にとって有害です。
ここでわかるように: http://www.opengl.org/wiki/Stencil_Test ステンシル テストは fragmentShader の後に実行されます。パフォーマンスが良くないことは理解しています。