現在の深度バッファをテクスチャに取得して、シェーダでアクセスしたいと考えています。さまざまな理由から、別の深度パスを実行することはできませんが、既にレンダリングされた深度をコピーする必要があります。
glReadPixels
CPU が関与し、パフォーマンスが低下する可能性があります。私の知る限り、glBlitFramebuffer
深さから色へのブリットはできず、深さから深さへのブリットのみです。
GPUでこれを行う方法は?
これを行う最新の方法は、FBO を使用することです。それに色と深度のテクスチャをアタッチし、レンダリングしてから FBO を無効にし、デフォルトのフレームバッファにレンダリングするシェーダーへの入力としてテクスチャを使用します。
FBO について必要なすべての詳細は、ここで見つけることができます。
深度バッファをテクスチャにコピーするのは非常に簡単です。glTexImage* を呼び出していない新しいテクスチャを作成した場合は、glCopyTexImage2D を使用できます。これにより、ピクセルがフレーム バッファからテクスチャにコピーされます。深度ピクセルをコピーするには、GL_DEPTH_COMPONENT 形式を使用します。GL_DEPTH_COMPONENT24 をお勧めします。
以前に深度コンポーネント形式でテクスチャを作成したことがある場合 (つまり、最初のフレームの後のいつでも)、glCopyTexSubImage2D を使用してこの画像データに直接コピーできます。
また、シェーダーで深度コンポーネント テクスチャにアクセスするのに問題があるようです。これは、深度から色へのコピーが必要なためです (これは許可されていません)。もしそうなら、それはあなたが解決すべき問題です。
いずれにせよ、コピーは最後の手段です。可能な限り、フレームバッファ オブジェクトを使用する必要があります。テクスチャに直接レンダリングするだけです。
最良の方法は、パフォーマンスを向上させ、コーディングスタイルの問題を解決するために、FBO を使用することです。興味がない場合は、このコードを見てください。それは私がずっと若い頃からです!(そしてFBOが存在することを知りませんでした)
int shadowMapWidth = 512;
int shadowMapHeight = 512;
glGenTextures(1, &m_depthTexture);
glBindTexture(GL_TEXTURE_2D, m_depthTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, shadowMapWidth, shadowMapHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0);
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 512,512);