破棄キーワードが実行される前に、深度バッファはフラグメントの深度で更新されますか?
いいえ、この種の動作は、任意の値を含むシェーダーdiscard
または に任意の値を書き込むシェーダーでは明示的に禁止されていますgl_FragDepth
。これは、このようなシェーダーでは、シェーディング後のフラグメントの深度が、最初のラスタライズ (プレシェーディング) 中に生成された位置と無関係になる可能性があるためです。
書き込みgl_FragDepth
や破棄を行わなくても、実際のフラグメント シェーダーが実行されるずっと前に、フラグメントの深さが実際にわかっているため、初期の深さテストの基礎が形成されます。フラグメント シェーダーが評価される前に深度テストに失敗したと判断できる場合は、プリミティブの一部 (個々のタイル領域) またはすべてのラスタライズ/シェーディングをスキップできますが、フラグメント シェーダー自体がフラグメントの深度を決定するものである場合、その後、すべての賭けはオフです。
DX11 / OpenGL 4.x では、この規則に例外があります。出力深度が深度テストの結果 (ラスタライズ中に生成された深度と同じ結果) を常に保持することを保証できるような方法でシェーダーを記述する場合、初期のフラグメント テストは、使用discard
または書き込みを行うシェーダーで有効にすることができます。 gl_FragDepth
. この機能は保守的な深さdiscard
として知られており、これを使用しない限り、全体的に初期の深さの最適化を破ることになると一般的に理解されています。
ここで、書き込んでいる値が深度テストに合格するか失敗するか (gl_FragDepth
異なる場合があります)、またはフラグメントが存続するかどうか (discard
使用される場合があります) を知る前に深度バッファーに書き込むべきではないため、プリミティブ シェーディングの理由がわかります。を含むフラグメント シェーダーではdiscard
、シェーダーが評価される前に深度バッファーに書き込むことはできません。