9

現在の深度バッファをテクスチャに取得して、シェーダでアクセスしたいと考えています。さまざまな理由から、別の深度パスを実行することはできませんが、既にレンダリングされた深度をコピーする必要があります。

glReadPixelsCPU が関与し、パフォーマンスが低下する可能性があります。私の知る限り、glBlitFramebuffer深さから色へのブリットはできず、深さから深さへのブリットのみです。

GPUでこれを行う方法は?

4

3 に答える 3

7

これを行う最新の方法は、FBO を使用することです。それに色と深度のテクスチャをアタッチし、レンダリングしてから FBO を無効にし、デフォルトのフレームバッファにレンダリングするシェーダーへの入力としてテクスチャを使用します。

FBO について必要なすべての詳細は、ここで見つけることができます。

于 2011-06-14T08:57:19.067 に答える
5

深度バッファをテクスチャにコピーするのは非常に簡単です。glTexImage* を呼び出していない新しいテクスチャを作成した場合は、glCopyTexImage2D を使用できます。これにより、ピクセルがフレーム バッファからテクスチャにコピーされます。深度ピクセルをコピーするには、GL_DEPTH_COMPONENT 形式を使用します。GL_DEPTH_COMPONENT24 をお勧めします。

以前に深度コンポーネント形式でテクスチャを作成したことがある場合 (つまり、最初のフレームの後のいつでも)、glCopyTexSubImage2D を使用してこの画像データに直接コピーできます。

また、シェーダーで深度コンポーネント テクスチャにアクセスするのに問題があるようです。これは、深度から色へのコピーが必要なためです (これは許可されていません)。もしそうなら、それはあなたが解決すべき問題です。

いずれにせよ、コピーは最後の手段です。可能な限り、フレームバッファ オブジェクトを使用する必要があります。テクスチャに直接レンダリングするだけです。

于 2011-06-14T09:36:32.763 に答える
3

最良の方法は、パフォーマンスを向上させ、コーディングスタイルの問題を解決するために、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);
于 2011-06-16T12:27:04.077 に答える