OpenGL:FrameBuffer

可连接
可连接
支持读写采样
仅GPU内部操作
帧缓冲对象 FBO
附件
纹理
RenderBuffer
着色器采样
硬件优化

帧缓冲就是我们自己可以使用的一个缓冲,在这个缓冲里面,我们可以写入颜色、深度和模板信息(color, depth and stencil)。

为了使用这个framebuffer,必须给它附加一个texture 或者 renderbuffer,相当于vao和vbo的关系,framebuffer管理它的 texturerenderbuffer,数据都存储在这两个上面。其中texture可以存储颜色、深度和模板信息,可以直接进行读写操作,而renderbuffer 一般用来存储深度和模板信息,不能直接读。

注意:两者是可以同时绑定的。

附件类型对比:

特性纹理附件 (Texture)渲染缓冲 (Renderbuffer)
存储用途颜色/深度/模板均可主要深度/模板
CPU访问glReadPixels+着色器glReadPixels
着色器访问✅ 可被采样❌ 无法绑定采样
性能特点Mipmap/Filter支持硬件层优化(某些GPU更快)
适合场景后处理/屏幕特效纯深度测试(如阴影生成)

使用帧缓冲的步骤:

  1. 创建FBO
GLuint fbo;
glGenFramebuffer(1, &fbo);
  1. 为FBO创建 texture 或者 renderbuffer,用于存储信息
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
// 这里我用来存储颜色信息
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);  // 空纹理
// 设置纹理参数
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);  
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

// 用来存储深度和模板信息
GLuint rbo;
glGenRenderbuffers(1, &rbo);
glBindRenderbuffer(GL_RENDERBUFFER, backwardSceneDepthRBO);  
// 分配内存 + 格式
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);
  1. 为 fbo 绑定 texturerenderbuffer
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);

// 检查 fbo 是否完整
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)  
	// 常见失败原因
	// 1. 尺寸不一致 2. 格式不支持 3. 无颜色附件
    std::cout << "FBO is not complete!" << std::endl;

glBindFramebuffer(GL_FRAMEBUFFER, 0);
  1. 渲染一遍场景,这次渲染主要是为了存储信息到自己的fbo中
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glViewport(0, 0, width, height);    // 必须匹配fbo尺寸
renderScene();
glBindFramebuffer(GL_FRAMEBUFFER, 0);
  1. 后续正常渲染,可以使用刚刚保存的信息
glViewport(0, 0, originwidth, originheight);
// 这里直接将刚刚渲染的场景当做纹理用了
glActiveTexture(GL_TEXTURE);
glBindTexture(GL_TEXTURE_2D, texture);
renderScene();

使用到的函数

  • glBindFramebuffer(GLenume target, GLuint framebuffer)
    • target:指定使用帧缓冲的目标类型
      • GL_FRAMEBUFFER:同时绑定到读写帧缓冲(最常用)
      • GL_READ_FRAMEBUFFER:仅绑定到读取操作(如 glReadPixels)
      • GL_DRAW_FRAMEBUFFER:仅绑定到绘制操作(如渲染命令)
    • framebuffer:帧缓冲对象ID。0为默认窗口的系统帧缓冲(GLFW创建的)。
  • glRenderbufferStorage(GLenume target, GLenum internalformat, GLsizei width, GLsizei height):为当前绑定的渲染缓冲对象分配存储空间
    • target必须为GL_RENDERBUFFER,指定操作对象类型
    • internalformat存储格式 (如 GL_DEPTH_COMPONENT24, GL_DEPTH24_STENCIL8)
    • width:渲染缓冲宽度(像素)
    • height:渲染缓冲高度(像素)
  • glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level):将2D纹理附加到帧缓冲的指定附件点
    • target:帧缓冲目标 (GL_FRAMEBUFFER, GL_READ_FRAMEBUFFER)
    • attachment附件类型 (GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT等)
    • textarget纹理类型 (GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP_POSITIVE_X等)
    • texture:纹理对象ID
    • level:纹理mipmap级别 (通常为0)
  • glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer):将渲染缓冲附加到帧缓冲的指定附件点
    • target:帧缓冲目标 (GL_FRAMEBUFFER, GL_READ_FRAMEBUFFER)
    • attachment附件类型 (GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT, GL_DEPTH_STENCIL_ATTACHMENT等)
    • renderbuffertarget必须为GL_RENDERBUFFER
    • renderbuffer:渲染缓冲对象ID

使用Framebuffer制作的效果:

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ht巷子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值