C# 什么';opengl最简单的帧缓冲区示例是什么?

C# 什么';opengl最简单的帧缓冲区示例是什么?,c#,opengl,opentk,C#,Opengl,Opentk,我正在尝试将后期处理添加到我的游戏中,但我无法理解learnopengl和opengl教程中的帧缓冲区教程。我只需要一个带有颜色和深度纹理的简单帧缓冲区示例,以及如何使用和渲染它 我不知道如何实现帧缓冲区 public class FrameBuffer { public int FBO,DBO; public int Width, Height; public int tex,depth; public FrameB

我正在尝试将后期处理添加到我的游戏中,但我无法理解learnopengl和opengl教程中的帧缓冲区教程。我只需要一个带有颜色和深度纹理的简单帧缓冲区示例,以及如何使用和渲染它

我不知道如何实现帧缓冲区

  public class FrameBuffer
    {
        public int FBO,DBO;
        public int Width, Height;
        public int tex,depth;

        public FrameBuffer(int width, int height)
        {
            this.Width = width;
            this.Height = height;

            FBO = GL.GenFramebuffer();
            Bind();

            tex = GL.GenTexture();
            GL.BindTexture(TextureTarget.Texture2D, tex);
            GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgb, Width, Height, 0, PixelFormat.Rgb, PixelType.UnsignedByte, (IntPtr)null);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest);

            GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, TextureTarget.Texture2D, tex, 0);
        }
        public void Bind()
        {
            GL.BindFramebuffer(FramebufferTarget.Framebuffer, FBO);
        }
        public void Unbind()
        {
            GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0);
        }

您的代码使用颜色平面设置适当的帧缓冲区

如果framebufer必须具有深度缓冲区,则必须创建深度纹理,使用格式和内部格式之一
PixelInternalFormat.DepthComponent16
PixelInternalFormat.DepthComponent24
PixelInternalFormat.DepthComponent32
PixelInternalFormat.DepthComponent32f

depth=GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D,深度);
GL.TexParameter(TextureTarget.Texture2D,
TextureParameterName.TextureMinFilter,(int)TextureMinFilter.Nearest);
GL.TexParameter(TextureTarget.Texture2D,
TextureParameterName.TextureMapFilter,(int)TextureMapFilter.Nearest);
GL.TexImage2D(TextureTarget.Texture2D,0,PixelInternalFormat.DepthComponent24,
宽度,高度,0,PixelFormat.DepthComponent,PixelType.Float,(IntPtr)null);
将其附加到帧缓冲区,以

GL.FramebufferTexture2D(FramebufferTarget.Framebuffer,
FramebufferAttachment.DepthAttachment,
TextureTarget.Texture2D,深度,0);
注意:附加颜色缓冲区和深度缓冲区后,应验证帧缓冲区的完整性,该完整性应返回
状态
FramebufferErrorCode.FramebufferComplete

FramebufferErrorCode status=GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer);

作为深度纹理的替代,您可以附加(深度)渲染缓冲:

depth=GL.GenRenderbuffer();
GL.BinderBuffer(RenderbufferTarget.Renderbuffer,深度);
GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer,
RenderbufferStorage.Depth组件24、宽度、高度);
GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer,0);
GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer,
FramebufferAttachment.DepthAttachment,
RenderbufferTarget.Renderbuffer,深度);

你有完整的例子吗?我在想如何使用时仍然有困难this@vincentcastro您的示例设置了一个完整的帧缓冲区。我向你展示了如何添加深度缓冲区。你说的“如何使用这个”是什么意思?这还不清楚。什么不起作用?你想达到什么目的?我可以在代码的中间复制我的代码,但我不认为这是你要的。我是说我不确定我将如何显示它,我还是新的。opengl@vincentcastro可以使用附加到帧缓冲区的纹理绘制新几何体,例如四边形(矩形)在整个屏幕上,也可以使用将帧缓冲区的内容直接复制到屏幕上(默认帧缓冲区)。