位置: 编程技术 - 正文

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(学习计划)

  • 投资公司取得的投资收益属于销售额吗
  • 出口货物不报关走快递
  • 一个营业执照可以开几家淘宝店
  • 集装箱维护是做什么的
  • 现金流量表和利润表关系
  • 发放遗属补助还要拍照片吗山东
  • 怎么查纳税人信用等级
  • 稿费计入成本怎么做账
  • 进账多于销项怎样报税
  • 子母公司有连带责任吗
  • 农户贷款免征增值税吗?
  • 专家评审费个人所得税由谁支付
  • 简易征收货物的运费
  • 企业当年发生的某些费用
  • 房贷利息在哪里能看到
  • 增加以前年度收入是否需要更正申报年报
  • 企业进项税和销项税抵扣政策
  • 将商业承兑汇票进行贴现 符有追索权的会计分录
  • 卖出别人赠送的东西会计分录?
  • 福利费的支付范围
  • Mac怎么用有线网络
  • windows在cmd设置变量
  • 企业在进行会计核算时选择一种不多计资产
  • 冲抵备用金
  • 长期借款利息如何做账
  • 销售黄金的会计分录
  • 新个人所得税的发展现状
  • php单双引号的区别
  • php判断ip是否属于某个区段
  • ElementPlus DateTimePicker日期时间选择器限制可选时间范围(精确时分秒)
  • 现金支票提取备用金会计处理
  • linuxvim批量替换
  • 超分辨率代码
  • content security policy blob
  • 最强alpha什么意思
  • 反向选择命令
  • php css教程下载
  • 其他应收款待抵扣进项
  • 帐没做完怎么报增值税
  • 普通发票两联都盖章吗
  • mongodb aggregate 性能
  • 公司的融资租赁怎么做账
  • 个税专项附加扣除标准2023
  • sql dbo
  • 公户的结算卡是否可以转账
  • 企业对公帐户怎么转出私人帐户
  • 库存商品期末余额怎么计算
  • 纸质专票红冲
  • 外资研发中心可以上市吗
  • 丢失增值税专用发票的征管政策
  • 私募基金如何做账
  • 国有企业无偿划转股权缴纳印花税
  • 募捐建议
  • 应付账款周转率越大说明什么
  • 归还银行贷款利息计入
  • 转回坏账准备影响营业利润吗
  • 存货报废如何做账
  • 注销公司复杂吗?
  • 代持的股份
  • 固定资产折旧计入什么费用
  • 生产成本结转到本年利润吗
  • 残疾人就业保障金怎么计算
  • 投资性房地产是固定资产吗
  • 企业建账涉及哪些内容
  • SQL server字符串存数据库大还是二进制大
  • sql平均数函数
  • 老毛桃winpe系统对注册表信息进行备份的方法
  • fat32转换为ntfs分区命令
  • win7 64位系统安装绘声绘影8提示已安装另一个版本的解决方法
  • win xp 虚拟内存
  • win10安装office2016无法注册字体可以忽略吗?
  • uefi bios ufilify
  • unity3d颜色
  • 超全面的竣工验收流程及资料
  • 在dos下删除文件
  • python查找字符串中指定字符的个数
  • 东莞各税务分局电话
  • 广东省电子税务局电话
  • 河北省税务局地址邮编
  • 国税总局17号公告
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设