Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OpenGL帧缓冲区深度缓冲区不工作_C#_Opengl_Fbo_Depth Buffer_Depth Testing - Fatal编程技术网

C# OpenGL帧缓冲区深度缓冲区不工作

C# OpenGL帧缓冲区深度缓冲区不工作,c#,opengl,fbo,depth-buffer,depth-testing,C#,Opengl,Fbo,Depth Buffer,Depth Testing,我正在尝试创建一个具有颜色和深度缓冲区的帧缓冲区对象。颜色缓冲区工作正常,但深度缓冲区不工作 问题不太可能出现在场景绘制例程中,因为使用默认帧缓冲区时,该例程工作正常。禁用深度测试时,场景会绘制某些内容,但启用深度测试时,场景不会绘制。我只能得出结论,创建深度缓冲区并将其附加到帧缓冲区的方式存在问题。帧缓冲区创建成功后,我尝试了许多不同的深度缓冲区格式,还尝试了渲染缓冲区等效格式,但这些更改似乎都没有什么不同 我确实尝试过使用glReadPixels读取深度缓冲区的像素。它似乎有一些变化,表明场

我正在尝试创建一个具有颜色和深度缓冲区的帧缓冲区对象。颜色缓冲区工作正常,但深度缓冲区不工作

问题不太可能出现在场景绘制例程中,因为使用默认帧缓冲区时,该例程工作正常。禁用深度测试时,场景会绘制某些内容,但启用深度测试时,场景不会绘制。我只能得出结论,创建深度缓冲区并将其附加到帧缓冲区的方式存在问题。帧缓冲区创建成功后,我尝试了许多不同的深度缓冲区格式,还尝试了渲染缓冲区等效格式,但这些更改似乎都没有什么不同

我确实尝试过使用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.");

我不得不说,这听起来很像你没有清除深度缓冲区。很可能是您的绘图代码造成的,例如,如果您在某个点调用
glClear(…)
,而您的FBO未绑定-这将仅清除默认帧缓冲区。@AndonM.Coleman我希望如此,但我已加倍检查,并在清除深度缓冲区之前绑定了帧缓冲区。glReadBytes证明它正在清除它。真的吗?当深度缓冲区只是绘图源而不是读取源时,如何准确地使用
glReadPixels(…)
?您的FBO需要绑定到Draw和Read,目标
GL\u FRAMEBUFFER
会执行此操作(在OpenTK术语中是
FramebufferTarget.FRAMEBUFFER
FramebufferTarget.DrawFramebuffer
相当于
GL\u Draw\u FRAMEBUFFER
)。哦,对了,当我这样做时,代码是FramebufferTarget.FRAMEBUFFER。我最近才将其更改为FramebufferTarget.DrawFramebuffer,以查看它是否有所不同。我会把它换回来的。嘿,老兄,我知道这个问题有点老了,但你解决了这个问题吗?我有完全相同的问题,我担心这是一个opentk错误:/