編集:問題がそこから発生していないことを確認するために、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 にアタッチすると、すべてが期待どおりに機能し、シーンがテクスチャに正しくレンダリングされます。だから私は問題がテクスチャをどのようにアタッチしているか、または私が何かをしている順序から来ていると思いますか?