3

破棄キーワードを使用して一部のフラグメントを破棄するフラグメント シェーダーを使用しています。私のシェーダーは、early_fragment_tests (image store load obliges) も使用します。

EDIT : は書きませんgl_FragDepth。標準の OpenGL に深度値を処理させます。

破棄キーワードが実行される前に、深度バッファはフラグメントの深度で更新されますか?

編集:私のNVidia Quadro 600とK5000ではそうではないようです。

その情報を見つけることができる手がかりはありますか?参考までに、 http://www.opengl.org/registry/specs/ARB/shader_image_load_store.txtを検索しました。十分に近いトピックを見つけましたが、その特定のものではありませんでした。

4

2 に答える 2

4

破棄キーワードが実行される前に、深度バッファはフラグメントの深度で更新されますか?

いいえ、この種の動作は、任意の値を含むシェーダーdiscardまたは に任意の値を書き込むシェーダーでは明示的に禁止されていますgl_FragDepth。これは、このようなシェーダーでは、シェーディング後のフラグメントの深度が、最初のラスタライズ (プレシェーディング) 中に生成された位置と無関係になる可能性があるためです。

書き込みgl_FragDepthや破棄を行わなくても、実際のフラグメント シェーダーが実行されるずっと前に、フラグメントの深さが実際にわかっているため、初期の深さテストの基礎が形成されます。フラグメント シェーダーが評価される前に深度テストに失敗したと判断できる場合は、プリミティブの一部 (個々のタイル領域) またはすべてのラスタライズ/シェーディングをスキップできますが、フラグメント シェーダー自体がフラグメントの深度を決定するものである場合、その後、すべての賭けはオフです。

DX11 / OpenGL 4.x では、この規則に例外があります。出力深度が深度テストの結果 (ラスタライズ中に生成された深度と同じ結果) を常に保持することを保証できるような方法でシェーダーを記述する場合、初期のフラグメント テストは、使用discardまたは書き込みを行うシェーダーで有効にすることができます。 gl_FragDepth. この機能は保守的な深さdiscardとして知られており、これを使用しない限り、全体的に初期の深さの最適化を破ることになると一般的に理解されています。

ここで、書き込んでいる値が深度テストに合格するか失敗するか (gl_FragDepth異なる場合があります)、またはフラグメントが存続するかどうか (discard使用される場合があります) を知る前に深度バッファーに書き込むべきではないため、プリミティブ シェーディングの理由がわかります。を含むフラグメント シェーダーではdiscard、シェーダーが評価される前に深度バッファーに書き込むことはできません。

于 2013-11-07T00:22:51.833 に答える
1

あなたが探している情報はそのページにあると思います:

初期のフラグメント テストが有効になっている場合、フラグメント シェーダーによって計算された深度値は効果がありません。さらに、デプス バッファー、ステンシル バッファー、およびオクルージョン クエリのサンプル カウントは、アルファ対カバレッジやアルファ テストなどのフラグメントごとの操作により、フラグメント シェーダーの実行後に破棄されるフラグメントまたはサンプルに対しても更新される場合があります。

「深度バッファなどは更新される可能性がある」の「可能性がある」という言葉は、実装に依存する (または完全にランダムである) ことを意味します。

于 2013-11-06T18:32:37.517 に答える