位置: 编程技术 - 正文

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

  • 一次性医用外科口罩哪个牌子好
  • 股份公司解散是什么?
  • 残保金滞纳金能抵扣吗
  • 税收优惠退税会计处理
  • 一般纳税人购买并销售免税货物所发生的运输费用
  • 购销合同印花税优惠政策
  • 材料亏损怎么做会计分录?
  • 房产空置怎么判定
  • 个人所得税薪金所得是实发工资还是应发工资
  • 小规模季度不超过多少不用交税
  • 职工工资个人所得税缴纳标准
  • 按季申报是什么意思
  • 担保扶持基金可以冲代偿吗
  • 所得税纳税调增调减怎么理解
  • 独立核算的分公司可以享受小微企业吗
  • windows10如何切屏
  • 贸易型企业怎么做账
  • 快速迅雷
  • 海尔笔记本最新款
  • 企业所得税申报错误怎么更改
  • 企业所得税调增调减项目比例
  • 收到预付账款会对企业财务有影响吗
  • PHP:Memcached::setOption()的用法_Memcached类
  • 笔记本电脑保养与维护
  • 异构图神经网络 电影推荐
  • 开立异地银行结息通知
  • thinkphp6依赖注入
  • qt+opencv教程
  • vue过滤器可以异步吗
  • semeion手写数据集
  • 计提工会经费怎么做账务处理
  • 展会门票怎么入账
  • 普通支票和现金支票区别
  • 员工出差回来会计分录
  • 当月入账的进项税必须当月认证吗
  • 税盘清卡清不了怎么办
  • 投资性房地产在建期间需要摊销吗
  • 调整多计提的工资
  • 公司向员工发放的慰问金怎么做账
  • 个人提供劳务报酬如何交税
  • 职工基本医疗保险怎么用
  • 销售软件产品
  • 增值税发票开错冲红重开如何做会计分录?
  • 贴现公司贴现合法吗
  • 坏账收回所得税需要确认收入吗汇算清缴表如何填报
  • 银行日记账更正
  • 应收利息的账务处理方法
  • 环境保护税法自什么时候起施行
  • 新办企业增多
  • 计提坏账准备需要哪些资料
  • 销售毛利率越高越好吗
  • mysql使用的协议
  • win8系统和win7哪个好
  • ubuntu安装transmission
  • 要建立linux分区可以有哪几种方法
  • linux增加命令
  • windos8怎么样
  • 如何解决焦虑的心理
  • win10不能显示桌面
  • mac验证码无法显示怎么办
  • windows8怎么装windows10
  • xp sp3精简版
  • win7系统安装ie11浏览器
  • pavprot.exe - pavprot是什么进程 作用是什么
  • windows10使用ie浏览器
  • gzip: stdin: unexpected end of file tar: Unexpected EOF in archive tar: Unexpect
  • windows 10 升级
  • unity的设置在哪里
  • shell脚本的fi
  • linux里面vim
  • cocos2dx3.3在Win7(64位)上Android开发环境搭建(提要)
  • 一些实用性较高的东西
  • jQuery插件能输出到控制台
  • nodejs document
  • 应用框架的设计方法
  • android activity回调函数
  • jquery轮播图代码
  • jquerybind事件
  • 税务机关文化建设
  • 河北地方税务局网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设