色と深度のバッファを持つフレームバッファ オブジェクトを作成しようとしています。カラー バッファは正常に機能しますが、深度バッファは機能しません。
デフォルトのフレームバッファを使用すると問題なく動作するため、問題がシーン描画ルーチンにある可能性は低いです。深度テストが無効になっている場合、シーンは何かを描画しますが、深度テストが有効になっている場合、シーンは描画されません。深度バッファが作成され、フレームバッファにアタッチされる方法に問題があるとしか結論付けられません。フレーム バッファーが正常に作成されました。さまざまな深度バッファー形式と同等のレンダー バッファーを試しましたが、これらの変更のいずれも違いがないようです。
glReadPixels を使用して深度バッファーのピクセルを読み取ろうとしました。いくつかの変更があったようで、シーンが深度バッファーに正常に書き込んでいることを示しています。
以下は、フレーム バッファを作成するためのコードです。問題をさらに修正したり、デバッグするのに役立つものは他にありますか? おそらく、カスタム フレームバッファ用に設定する必要があるが、デフォルトではないものでしょうか?
// Create and attach texture to framebuffer
_texture = (GLTexture)context.CreateTexture(width, height);
// Create depth texture
_depthBufferName = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, _depthBufferName);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.DepthComponent, width, height, 0, PixelFormat.DepthComponent, PixelType.Float, IntPtr.Zero);
// Create depth render buffer
// _depthBufferName = GL.GenRenderbuffer();
// GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, _depthBufferName);
// GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferStorage.Depth24Stencil8, width, height);
// Create and bind frame buffer
GL.GenFramebuffers(1, out _name);
GL.BindFramebuffer(FramebufferTarget.Framebuffer, _name);
GL.FramebufferTexture(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, _texture.Id, 0);
GL.FramebufferTexture(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthAttachment, _depthBufferName, 0);
// GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthStencilAttachment, RenderbufferTarget.Renderbuffer, _depthBufferName);
GL.DrawBuffers(1, new[] { DrawBuffersEnum.ColorAttachment0 });
// Check if framebuffer has been setup successfully
if (GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer) != FramebufferErrorCode.FramebufferComplete)
throw new SDL2Exception("Unable to create framebuffer.");