C# 什么';opengl最简单的帧缓冲区示例是什么?
我正在尝试将后期处理添加到我的游戏中,但我无法理解learnopengl和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
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可以使用附加到帧缓冲区的纹理绘制新几何体,例如四边形(矩形)在整个屏幕上,也可以使用将帧缓冲区的内容直接复制到屏幕上(默认帧缓冲区)。