3

私は OpenGL テクスチャを持っていて、1 つのピクセルの値を読み戻して画面に表示できるようにしたいと考えています。テクスチャが通常の古い RGB テクスチャなどである場合、これは問題ありません。横になっている空のフレームバッファ オブジェクトを取得し、テクスチャをフレームバッファの COLOR0 にアタッチして、次のように呼び出します。

glReadPixels(x, y, 1, 1, GL_RGBA, GL_FLOAT, &c);

ここで、c は基本的に float[4] です。

ただし、深度テクスチャの場合は、COLOR0 の代わりに DEPTH アタッチメントを設定して、別のコード パスをたどる必要があります。

glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &c);

ここで、c は float です。これは、NVIDIA GeForce 580 を実行している Windows 7 コンピューターでは問題なく動作しますが、古い 2008 MacBook Pro ではエラーが発生します。具体的には、深度テクスチャをフレームバッファにアタッチした後、glCheckFrameBufferStatus(GL_READ_BUFFER) を呼び出すと、GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER が返されます。

OpenGL のドキュメントを検索した後、次の行を見つけました。これは、カラー アタッチメントがない場合、OpenGL がフレーム バッファの深度コンポーネントからの読み取りをサポートしていないことを示しているようです。

GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER is returned if GL_READ_BUFFER is not GL_NONE 
and the value of GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is GL_NONE for the color 
attachment point named by GL_READ_BUFFER.

案の定、一時的なカラー テクスチャを作成して COLOR0 にバインドすると、深度テクスチャからピクセルを読み取ってもエラーは発生しません。

このコードを使用して毎回一時的なテクスチャを作成する (編集: または 1 回でも GPU メモリが拘束されている) のは煩わしく、遅くなる可能性があるため、深さから単一のピクセルを読み取る別の方法を誰かが知っているかどうか疑問に思っていましたテクスチャ?(もちろん、他に良い方法がない場合は、必要に応じてサイズを変更するために 1 つのテクスチャを保持し、一時的な色のアタッチメントにはそれのみを使用しますが、これはかなり遠回しに思えます)。

4

1 に答える 1

5

答えはエラーメッセージに含まれています:

GL_READ_BUFFER が GL_NONE でない場合

そうしてください。読み取りバッファを に設定しますGL_NONE。とglReadBuffer。このような:

glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo); //where fbo is your FBO.
glReadBuffer(GL_NONE);

そうすれば、深度テクスチャしかない場合でも、FBO は適切に完成します。

于 2012-07-16T18:59:16.970 に答える