0

編集:問題がそこから発生していないことを確認するために、FBOを方程式から外したので、今は次のことを行っています:

セットアップ テクスチャ:

GLuint FB0Texture;
glGenTextures(1, &FB0Texture);
glBindTexture(GL_TEXTURE_2D, FB0Texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, size.width, size.height, 
                 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0);

そしてレンダリングします:

[self drawScene];

[(EAGLView *)self.view bindFB0];

glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 320, 480);

[self drawFullScreenQuad]; (it's actually not full screen so I can see both the 3d scene and the resulting texture)

同じ結果が得られます!FB0Texture を「DEPTH_COMPONENT」テクスチャとして設定すると黒いテクスチャですが、FB0Texture を通常の GL_RGBA テクスチャとして設定すると通常のシーン...

だから私は深さテクスチャを間違って設定していると思いますか、それともレンダリングで何か間違ったことをしている可能性があります。GL_DEPTH_TEST が有効になっており、正常に動作しているため (モデルは正しく見えます)、実際のレンダリングに問題はないと思いますが、この時点で手がかりを切望しています ...

助けてください!

// 編集の終わり

iPhoneで基本的なシャドウマッピングを実装しようとしていますが、深度値をテクスチャにレンダリングすることに行き詰まっています...これは私を夢中にさせています.

だから私がやっていること:

  • デフォルトのフレームバッファをセットアップし、カラー レンダ バッファと深度レンダ バッファをアタッチします。
  • 新しいフレームバッファ (FB0 と呼びます) をセットアップし、深度コンポーネントにテクスチャをアタッチします。

次に、レンダリングすると:

  • シーンをFB0に描画
  • デフォルトのフレームバッファに切り替える
  • テクスチャとして FB0 を使用して全画面クワッドを描画します

そして、私は...何も得ません!(まあ、完全な白いテクスチャが得られます)

深度コンポーネントではなく FB0 のカラー コンポーネントにテクスチャをアタッチすると、シーンを FB0 に描画し、FB0 をテクスチャとして使用してフル スクリーンのクワッドを描画するように、すべてが正常に機能します。デフォルトのフレームバッファに直接描画しているかどうかを確認してください。

ただし、深度コンポーネントにテクスチャをアタッチすると、この白い画面/テクスチャしか得られません。

いくつかのコード:

バッファのセットアップ:

// Create default framebuffer object.
glGenFramebuffers(1, &defaultFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);

// Create color render buffer and allocate backing store.
glGenRenderbuffers(1, &colorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);

// Create depth render buffer
glGenRenderbuffers(1, &depthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 320, 480); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);


// Create Depth Map Frame Buffer

glGenFramebuffers(1, &FB0);
glBindFramebuffer(GL_FRAMEBUFFER, FB0);

// Attach texture to depth component        

glGenTextures(1, &FB0Texture);
glBindTexture(GL_TEXTURE_2D, FB0Texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, size.width, size.height, 
                 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0);

glFramebufferTexture2D(GL_FRAMEBUFFER, 
                       GL_DEPTH_ATTACHMENT, 
                       GL_TEXTURE_2D, 
                       FB0Texture, 
                       0);

この後でフレームバッファのステータスを確認すると、エラー メッセージが表示されないため、バッファが正しく作成されていると想定しています。

次に、レンダリングで:

[(EAGLView *)self.view setFB0]; (just binds the framebuffer)

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

[self drawScene];

[(EAGLView *)self.view setFramebuffer]; (binds back the default frame buffer)

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

[(EAGLView *)self.view bindFB0Texture];

[self drawFullScreenQuad];

[(EAGLView *)self.view presentFramebuffer];

この時点で、深さを示す灰色のレベルを持つ白黒のテクスチャが表示されることを期待していましたが、代わりに単色の白いクワッド/テクスチャが表示されました。

ここでも、FB0Texture を GL_DEPTH_ATTACHMENT の代わりに GL_COLOR_ATTACHMENT0 にアタッチすると、すべてが期待どおりに機能し、シーンがテクスチャに正しくレンダリングされます。だから私は問題がテクスチャをどのようにアタッチしているか、または私が何かをしている順序から来ていると思いますか?

4

1 に答える 1

1

問題は、レンダー トゥ テクスチャ FBO にデプス テクスチャのみをアタッチし、カラー バッファもアタッチしていないという事実にある可能性があります。

これが機能しない場合、Appleは技術文書でGL_OES_depth_texture拡張機能を使用することを提案していますが、深度をテクスチャにレンダリングするという点では、これを自分で機能させることはできませんでした。私が取得しているカラーレンダリングからテクスチャへの画像の深度テスト。

編集:おっと、それはあなたがすでにやっていることです。質問をもっとよく読むべきです、すみません!

私も現在この問題を経験しているので、解決された場合はその方法を知りたいです!

編集#2:私は自分の状況で問題を解決しました。深度バッファーは深度を非線形空間に格納するため、深度を線形空間に変換して適切に視覚化する必要があります (これは、近距離および遠距離の投影情報で実現できます)。私が抱えていた問題は、ほとんどの深度情報が 0.995 から 1.0 の範囲に保存されていたことでした。つまり、私の目には完全に白いテクスチャとして見えました。これは、真っ白なテクスチャを取得しているときに発生している問題である可能性があります.

補足として、Xcode 4.2 の素晴らしい OpenGL ES スナップショット機能が問題の解決に役立ちました。コンテキスト内のすべてのテクスチャとレンダー バッファ オブジェクトを視覚化し、データが非線形の場合は色を再スケーリングすることもできます。ご想像のとおり、これは私がそれを理解した方法です。

于 2011-11-01T12:15:47.687 に答える