ピクセルシェーダーで現在処理されているピクセルの深度バッファー値にアクセスしたい。
どうすればこの目標を達成できますか?基本的に、2つのオプションがあるようです。
質問1:フラグメントシェーダーの深度バッファーから直接読み取ることはできません(私がよく知らない最近の拡張機能がない限り)。フレームバッファオブジェクト(FBO)にレンダリングする必要があります。典型的な手順:
glGenFramebuffers
やglBindFramebuffer
などの呼び出しを検索します。GL_COLOR_ATTACHMENT0
またはglFramebufferRenderbuffer
を使用してFBOのglFramebufferTexture2D
アタッチメントポイントにアタッチします。このレンダリングパスからの深さだけを気にする場合は、これをスキップして、カラーバッファなしでレンダリングできます。GL_DEPTH_ATTACHMENT
アタッチメントポイントにアタッチします。glBindFramebuffer
を使用して、デフォルトのフレームバッファに切り替えます。質問2:gl_FragCoord.z
は、シェーダーが操作しているフラグメントの深度値です。notフラグメント位置の深度バッファーの現在の値です。
gl_FragCoord.z
は、現在のフラグメントのウィンドウスペースの深さの値です。デプスバッファに格納されている値とは関係ありません。フラグメントがdiscard
edされておらず、合格した場合、値はlater深度バッファーに書き込まれる可能性がありますステンシル/深度テスト。
技術的には、深さを早期に書き込み/テストするハードウェアの最適化がいくつかありますが、すべての目的と目的のためにgl_FragCoord.z
は、デプスバッファに格納されている値ではありません。
複数のパスでレンダリングしない限り、フラグメントシェーダーの深度バッファーの読み取りと書き込みはできません。つまり、深度テクスチャを使用して深度を読み取り、次に向きを変えて新しい深度を書き込むことはできません。これは、フラグメントシェーダーでブレンディングを実装しようとするのと似ていますが、DX11クラスのハードウェアと画像のロード/ストアでエキゾチックなことをしない限り、機能しません。
シャドウマッピングなどで最終的に描画されるシーンの深度のみが必要な場合は、深度のみのプリパスを実行して深度バッファを埋めることができます。 2番目のパスでは、深度バッファーを読み取りますが、書き込みは行いません。