位置: 编程技术 - 正文

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

  • 城建税的征税范围不包括农村对不对
  • 递延所得税资产和负债怎么计算
  • 摊余成本的构成内容
  • 转让不动产销项税
  • 资产负债表中应付职工薪酬是负数
  • 自产农产品增值税申报表填10行吗
  • 现金预算表中的利息怎么算
  • 小规模纳税人销售已使用固定资产
  • 由收款人签发,经付款人承兑
  • 企业支付宝里面的钱可以随时提到个人银行卡吗
  • 车辆挂靠收取管理费怎么做账
  • 以下属于财政收入的形式有
  • 管理部门购入固定资产
  • 个体户进货需要成本票吗
  • 增值税专用发票可以开电子发票吗
  • 开专票需要哪些东西
  • 增值税即征即退会计处理
  • 电费返还怎么查询
  • 进口报关单保费
  • 工程前期咨询收费标准
  • 支付水电费如何记账
  • 幼儿园会计做账实操
  • 印花税滞纳金应计入什么
  • 为员工购买的团员保险
  • 局域网的工作模式及特点
  • 咋激活windows
  • smtplib教程
  • php substring
  • 第三方开发是什么意思
  • php
  • it最高工资
  • PHP:mcrypt_enc_get_supported_key_sizes()的用法_Mcrypt函数
  • 利息收入可以冲减研发费用
  • 新西兰南岛西南部
  • thinkphp上传文件
  • 安装elipse教程
  • js中写php代码
  • 常用的css样式有哪些
  • centos7安装keepalived
  • 包工的人工费可以算工程款
  • 免征的教育费附加怎么做账
  • 劳务支出和应付职工薪酬
  • php注册功能
  • sql语句字符串比较大小
  • 施工现场补助规定
  • 运费和什么有关
  • 差旅费津贴属于应付职工薪酬吗
  • 货款未转到公司怎么处理
  • 客户送我东西怎么办
  • 其他权益工具投资公允价值变动计入什么科目
  • 个税滞纳金怎么计算
  • 检测公司成本科目
  • 收取加盟费的条件
  • 销项税票怎么开
  • 现金支票存根联丢失怎么办
  • 在建工程的进项税额不再分2年抵扣
  • mysql导出语句
  • sql 建索引
  • MySQL exists 和in 详解及区别
  • 将u盘制作成u启动u盘启动盘
  • centos6.5设置网络
  • win98拨号上网
  • linux生成文件
  • win10升级win1
  • win8怎么查ip地址查询
  • 图片加载完成再加载
  • bat批量命名
  • 命令行net
  • vue实现下载功能
  • javascript的prompt
  • 批处理压缩
  • jquery绑定onchange
  • jquery刷新页面的方法
  • python怎么用数组
  • unity相关问题
  • jquery控制css样式
  • 电子税务局驱动安装步骤
  • 居民个人从境外公司获得分红
  • 如何理解涉税零风险概念
  • 天津市东丽区军粮城派出所电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设