位置: 编程技术 - 正文

OpenGL Framebuffer Object (FBO)

编辑:rootadmin

推荐整理分享OpenGL Framebuffer Object (FBO),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

在OpenGL中, OpenGL Context有一个默认的FBO用来绘制图像, 但是我们也可以创建新的用户定义的Framebuffers, 这样我们可以绘制到自定义的framebuffer, 而不会影响到窗口系统。

关键词定义Image: 本文中, Image是包含像素的二维数组,这些像素具有特定的存储格式。Layered Image: 具有某一特定尺寸和格式的一套images, 对应于texture的某一个mipmap level. (注意 layered image不是一个人在战斗,而是一整套的images!)Texture: 表示一系列的images的集合。所有的image具有相同的格式, 但是尺寸不一样(不同的mipmap level). Texture 可以绑定(bind)到 shaders.Renderbuffer: 包含一个image, 不可以绑定(bind)到shaders, 只能附着(attach)到FBO.Framebuffer-attachable image: 可附着到FBO的imageFramebuffer-attachable layered image: 可附着到FBO的layered image.Attachment point: FBO中一个署名的附着点,可用来附着(attach) framebuffer-attachable image 和 framebuffer-attachable layered image. 对于附着(attach)的image,要求具有特定的格式。Attach: 附着是表示将两个物体连系起来, 和绑定(bind) 是不一样的。 一个物体被绑定(bind)到context, 但是物体与物体则是相互附着(attach). 绑定FBO

和其它 OpenGL object一样,FBO有以下的相关函数:

其中的target参数可以是:

GL_FRAMEBUFFERGL_READ_FRAMEBUFFERGL_DRAW_FRAMEBUFFER

GL_READ_FRAMEBUFFER:当target设置为GL_READ_FRAMEBUFFER时, framebuffer参数所指代的FBO变成读操作的目标,如glReadPixels, glCopyTexImage2D, glCopyTexSubImage2D. GL_DRAW_FRAMEBUFFER: 当target 设置为 GL_DRAW_FRAMEBUFFER是, framebuffer指代的FBO变成绘制操作的目标, 如glDrawArrays, glDrawElements等等。 GL_FRAMEBUFFER: 此时读操作和绘制操作都在此FBO上进行。

参数 framebuffer framebuffer的值是一个非负整数,0预留给由窗口系统提供的默认FBO. 当将参数设置为0时,目标还原到初始状态,即窗口系统提供的默认FBO.

一个FBO绑定到OpenGL context会一直有效,直到另一个FBO被绑定或者glDeleteFramebuffers被调用。

FBO attachment point

FBO有下列attachment points:

GL_COLOR_ATTACHMENTi: attachment points的数量跟实现相关, 最少需要8个, 所以i 至少可以取0-7范围以内的值, 附着的image必须具有可绘制的格式(color-renderable formats). 所有压缩格式都是不可绘制的,因此不可以附着到FBO.GL_DEPTH_ATTACHMENT:只能附着具有depth格式的image, 附着的image被称为FBO的depth buffer.GL_STENCIL_ATTACHMENT:只能附着具有stencil格式的image, 附着的image被称为FBO的stencil buffer.GL_DEPTH_STENCIL_ATTACHMENT:附着的image既是FBO的depth buffer 又是 stencil buffer. 被附着的image格式应该是a packed depth-stencil internal format.texture 类型简要回顾

1D texture 1D texture可以看成包含的image的高度为1

2D texture 2D texture是最好理解的了,包含2D image

3D texture 3D texture的每一个mipmap level就包含一套2D image. 如果用xy来表示image 平面,那么z 轴就是表示image的数量的维度,每一个整数就表示一个layered image. 因此,3D texture 中的每一张image都可以通过一个mipmap level 和一个 layer定位。

cubemap 包含一个立方体的六个平面,因此cubemap包含6张image, 因此每一张image可以通过mipmap level和平面定位。

1D array texture 每一个mipmap level包含一套2D image(高度为1),数量等于数组的维度, 每一张image由一个mipmap level 和数组索性(array index) 定位。

OpenGL Framebuffer Object (FBO)

2D array texture 和3D texture类似, 只要将z的值换成数组索引就可以。 每一张image 可以通过一个 mipmap level 和一个数组索引定位。 不同的是,数组大小不会随着mipmap层次的下降而改变。

Buffer texture 类似于1D texture, 只是它只包含一张image, 可以通过mipmap level 0 表示。

Attaching texture image

当我们需要将texture内部的某一张image 附着到FBO时,我们可以使用以下方法:

target 参数和glBindFramebuffer一样,但是这里GL_FRAMEBUFFER和GL_DRAW_FRAMEBUFFER等同。 attachment 参数则是上面提到的attachment point.textarget 当attach 非cubemap时, textarget 可以是 GL_TEXTURE_1D, GL_TEXTURE_2D_MULTISAMPLE 等等, 当attach的是cubemap, 必须使用glFramebufferTexture2D函数, textarget 必须是GL_TEXTURE_CUBE_MAP_POSITIVE_X/Y/Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_X/Y/Z.texture 参数是需要附着的texture 名称, 当texture 为 0时, 表示解除该attachment point的附着物。

注意,由于texture具有多个image, 因此必须明确指定需要attach的image.

Attaching renderbuffers

在创建好renderbuffer之后,你就可以将它attach到FBO:

renderbuffertarget 必须是 GL_RENDERBUFFERrenderbuffer: renderbuffer object nameAttaching layered image

上面讲了layered image对应于texture的某个mipmap level上的所有images, 当然像1D texture, 2D texture, 它们一个mipmap level 上只有一张image, 但是像 3D texture, 2D array texture, cubemap等等,一个mipmap level上面可是有很多的images的。 我们可以将整个mipmap level附着到某一个attachment point:

Framebuffer completeness

每一个attachment point都要求附着到它上面的image具有特定的格式, 但是当你将一个不符合要求的image 附着上来,并不会马上产生错误信息,而是要等到你使用FBO的时候错误才会显现出来。 当然除了image格式不符合要求, image的尺寸也有可能不符合条件, 因此, 我们需要一些手段来帮助我们检查FBO的完整度。

一个有效的FBO被称为”完整的Framebuffer” (“framebuffer complete”),检查FBO完整度,可以调用:

调用它并不是必需的,但是使用一个非完整的FBO会产生错误,因此在使用前检查FBO的完整度是一个好的习惯。当FBO完整时返回值是 GL_FRAMEBUFFER_COMPLETE, 否则就有问题。

Framebuffer blits

Framebuffer blits 可以高效的将一个framebuffer(GL_READ_FRAMEBUFFER)的某块矩形区域拷贝到另外一个framebuffer(GL_DRAW_FRAMEBUFFER).

srcX0, srcY0, srcX1, srcY1: 指定GL_READ_FRAMEBUFFER的源矩形区域。dstX0, dstY0, dstX1, dstY1: 指定GL_DRAW_FRAMEBUFFER的目标矩形区域。mask: 指定拷贝操作的按位‘或’掩码, GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, GL_STENCIL_BUFFER_BIT, GL_DEPTH_STENCIL_ATTACHMENT.filter: 当拷贝需要缩放时, 指定插值算法,GL_NEAREST 或 GL_LINEAR.

我们注意到mask掩码有一个GL_COLOR_BUFFER_BIT,但是我们FBO的color buffer attachment point却是多个, 到底拷贝哪个buffer,抑或是拷贝所有的color buffers? 答案是只拷贝一个buffer, 默认值在single-buffer configuration时 是 GL_FRONT, 在double-buffer configuration时 是 GL_BACK.

那么假如我们的GL_READ_FRAMEBUFFER是一个自定义FBO,显然我们必须要指定目标color buffer,这时我们使用函数:

mode: GL_FRONT_LEFT, GL_FRONT_RIGHT, GL_BACK_LEFT, GL_BACK_RIGHT, GL_FRONT, GL_BACK, GL_LEFT, GL_RIGHT, GL_COLOR_ATTACHMENTi.

glReadBuffer隐式的指定GL_READ_FRAMEBUFFER的color buffer, OpenGL还提供另外一个函数来显示的指定FBO:

除了影响glBlitFramebuffer, glReadBuffer还影响所有的可从color buffer 读数据的操作, 比如:glReadPixels, glCopyTexImage1D, glCopyTexImage2D, glCopyTexSubImage1D, glCopyTexSubImage2D, glCopyTextSubImage3D …

学习Nehe Lesson 6 && Lesson 7 && Lesson 8 这三课的基础都是第五课的那个正方体,无论是纹理映射或是光照键盘还是混合,都是对立方体进行的操作。当然,把正方体换成别的几何物体比如说

简析OpenGL的2D、3D切换 最近做游戏的时候遇到了一个小问题,我们的游戏是2D、3D结合的(准确的说是主菜单、议会界面是2D的,但是真实打斗场景为3D),由2D切换到3D没有问

OpenGL--图元 基础概念1,图元:组成3D物体最小的单位,包括:点,直线,多边形。就和化学里所有物体都是由原子组成的一样。2,点:数学上的点,只有位置,没

标签: OpenGL Framebuffer Object (FBO)

本文链接地址:https://www.jiuchutong.com/biancheng/373065.html 转载请保留说明!

上一篇:【Cocos2d-x】shader语法注意事项(cocoscreator shader)

下一篇:学习Nehe Lesson 6 && Lesson 7 && Lesson 8(学习计划)

  • 进项税有余额但没有余额
  • 契税通过应交税费
  • 小微企业季度平均资产看每季度吗
  • 财务报表与分析课后答案
  • 一次性年金怎么计算
  • 限定性资产账务处理
  • 关税消费税增值税计算公式
  • 存货计提跌价准备什么意思
  • 应付账款暂估会计处理
  • 查定征收方式适用于什么
  • 工伤费用的伤残补助金属于福利费吗
  • 外币账户的银行信息在哪查询
  • 电费票子丢了怎么办
  • 申请一般纳税人需要多长时间
  • 汽车租赁公司怎么赚钱
  • 个人捐款单位需要记账吗
  • 发票反写是什么时候
  • 固定资产简易办法3%减按2%
  • 税盘被锁应该怎么办?
  • 哪些情况下需要更换轮胎
  • 差额发票开具的步骤
  • 增值税专用发票电子版
  • 企业的商誉会一直存在吗
  • 坏账准备金最新计算公式
  • 兼职劳务费个税怎么算
  • 残保金和工会经费需要计提吗
  • 销售使用过的固定资产3%减按2%
  • flash动画导出视频有水印吗
  • 电脑温度过高会怎么样
  • 双cpu只有一个运行
  • 王者荣耀中墨子的最强出装
  • 工程完工结转成本怎么算
  • 销售合同怎么计提折旧
  • 数据处理教程
  • 分期收款销售商品,收到本期货款50万元
  • 单位房转卖
  • 窗函数的作用
  • 用php写的一个冒号的句子
  • 营改增企业所得税税率
  • 损益类科目调整影响所得税吗为什么
  • 预缴所得税会计分录咋做
  • 从 零开始
  • 减免税款月末怎么结转
  • 实收资本资本公积印花税怎么申报
  • 全国通用机打销售票查询
  • 海关报关单位注销操作规程
  • 个体户和公司的税收相差多少
  • 利润表的税金及附加怎么得出来
  • 房地产预缴增值税计算公式
  • 怎么才能不开发票
  • 临时售楼处需要什么手续
  • 增值税专用设备是什么
  • 收到银行季度结转怎么做
  • 餐费补贴属于工资还是福利费
  • 如何提取工会经费的钱
  • freebsd使用
  • 笔记本没有光驱怎么加装固态硬盘
  • centos关闭kdump
  • linux参数命令
  • macbook如何安装苹果系统
  • windows8使用技巧
  • centos 添加服务
  • linux做成服务
  • win8怎么做win7系统
  • win7怎连蓝牙
  • 批处理循环执行批处理
  • unity工程文件怎么弄
  • linux bash命令详解
  • javascript+css3 实现动态按钮菜单特效
  • Android shape 梯形
  • jquery table
  • javascript基础
  • 佛山市国家税务局狮山分局简介
  • 本期预缴税额怎么填
  • 开票软件提示连接服务器失败怎么办
  • 上善若水 宁静致远,适合小学标语吗?
  • 合并方为进行企业合并发生的佣金和手续费怎么处理?
  • 跨县调动工作流程
  • 全国增值税发票查验平台官网手机
  • 盘锦税务局招聘信息
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设