项目的程序里设计需要将某一帧渲染出来的画面拆成三通道单色图像存到三张纹理里面。要绘制到纹理里,自然就想到FBO了。但是一次要输出多张纹理,这个还没接触过。一阵网上搜索过后,终于了解到了MRT(多重渲染目标)。但是网上的教程大部分都使用到了Fragment Shader里的一个预置变量:gl_FragData[]。但是实际使用当中,glsl却报告说这个gl_FragData变量是不建议使用了。于是再经过多方搜索,知道了建议的操作方法是如何实现的。

首先自然是新建一个FBO,然后绑定缓存。一般的FBO我们会绑定一个颜色缓存和一个深度缓存。如果是渲染到纹理,我们就会把一个同样尺寸的纹理绑到颜色缓存中去,比如以下代码:

  1. //新建FBO
  2. GLuint fboId;
  3. glGenFramebuffersEXT(1, &fboId);
  4. glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);
  5. //绑定纹理
  6. glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
  7. GL_TEXTURE_2D, textureId, 0);
  8. //绑定深度缓存
  9. glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
  10. GL_RENDERBUFFER_EXT, rboId);

当然深度缓存也是要预先建好的。那么现在我需要绑定三个纹理,该如何绑定呢?

FBO是提供了不止一个颜色挂接点的。因此,我们可以将第i张纹理绑定到第i个颜色挂接点上。具体一个FBO能有多少个颜色挂接点,可以使用GL_MAX_COLOR_ATTACHMENTS_EXT参数来查询。

因此绑定纹理的代码就变成了:

  1. for(i=0; i<3; ++i)
  2. {
  3. glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT + i,
  4. GL_TEXTURE_2D, textureId[i], 0);
  5. }

当然纹理数量不能超过颜色挂接点的最大值。

准备工作完成之后,就是实际FBO渲染时的操作。在绑定多个纹理之后,绘制之前还要告诉FBO输出到哪些缓存。使用以下语句:

  1. GLenum mrt[] = {GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_COLOR_ATTACHMENT2_EXT};
  2. glDrawBuffers(3, mrt);

以上语句先枚举要输出的挂接点,然后使用glDrawBuffers语句来指定。此处绘制3个纹理。这些信息将被传入GLSL当中。

在Fragment Shader里还需要加一些语句:

  1. //此处3个location应当与FBO的GL_COLOR_ATTACHMENTi_EXT对应
  2. layout(location = 0) out vec4 Frag0;
  3. layout(location = 1) out vec4 Frag1;
  4. layout(location = 2) out vec4 Frag2;

这里就不用原来的gl_FragColor或者gl_FragData[]变量了,而是用自己指定位置的输出值。然后在Fragment的主循环里可以针对三个输出值做自己需要的处理。

于是绘制完成后,FBO就会将渲染结果存入三张纹理当中,可以进行后续的使用。

参考:

http://blog.csdn.net/xiajun07061225/article/details/7283929

http://blog.csdn.net/yangdelong/article/details/1668673

http://www.cnblogs.com/vertexshader/articles/3022981.html

GLSL使用FBO实现MRT(Multiple Render Targets)绘制到多张纹理 【转】的更多相关文章

  1. 认识多渲染目标(Multiple Render Targets)技术 【转】

    认识多渲染目标(Multiple Render Targets)技术 首先,渲染到纹理是D3D中的一项高级技术.一方面,它很简单,另一方面它很强大并能产生很多特殊效果. 比如说发光效果,环境映射,阴影 ...

  2. framebufferfetch in mali multiple render targets mrt

    gl_LastFragColorARM https://www.khronos.org/registry/OpenGL/extensions/ARM/ARM_shader_framebuffer_fe ...

  3. 认识多渲染目标(Multiple Render Targets)技术【转】

    http://www.cnblogs.com/hellohuan/archive/2008/12/01/1345359.html 首先,渲染到纹理是D3D中的一项高级技术.一方面,它很简单,另一方面它 ...

  4. GLSL实现Simple Displace Mapping 水仿真流体绘制 【转】

    http://blog.csdn.net/a3070173/archive/2008/11/20/3342062.aspx Dislace Mapping其实就是在顶点着色器中 对顶点进行置换偏移,经 ...

  5. 渲染、render与绘制

    渲染是抽象到具体的过程: 抽象:图片信息的描述(比如一条线:两个端点的位置.线粗.颜色等特征): 具体:依据抽象信息得到的可视图片(绘制过程). 渲染是中文翻译的问题,有种添油加醋的感觉.直意就是交与 ...

  6. OpenGL中FBO的概念及其应用 [转]

    http://www.cppblog.com/kongque/archive/2010/08/26/124754.html FBO一个最常见的应用就是:渲染到纹理(render to texture) ...

  7. [OSG]OSG例子程序简介

    1.example_osganimate一)演示了路径动画的使用(AnimationPath.AnimationPathCallback),路径动画回调可以作用在Camera.CameraView.M ...

  8. OSG中的示例程序简介

    OSG中的示例程序简介 转自:http://www.cnblogs.com/indif/archive/2011/05/13/2045136.html 1.example_osganimate一)演示 ...

  9. OSG中的示例程序简介(转)

    OSG中的示例程序简介 1.example_osganimate一)演示了路径动画的使用 (AnimationPath.AnimationPathCallback),路径动画回调可以作用在Camera ...

随机推荐

  1. 【JAVA】Eclipse中使用git进行pull远程代码

    当使用eclipse或者MyEclipse进行pull远程代码的时候,或者github的代码的时候报如下错误代码: 代表我们没有配置我们的Git地址,这里我教大家配置一下.首先下面是错误代码: The ...

  2. python3 生成器表达式

    生成器表达式 [i for i in range(100)] #列表解析 与列表解析的不同是,列表解析用中括号,生成器表达式用小括号 g = (i for i in range(1000)) #生成器 ...

  3. HDU1166(线段树单点更新区间查询)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  4. [MySQL] 一致性读分析

    MySQL MVCC MySQL InnoDB存储引起实现的是基于多版本的并发控制协议---MVCC(Multi-Version Concurrency Control),基于锁的并发控制,Lock- ...

  5. [转载]Go的50度灰:Golang新开发者要注意的陷阱和常见错误

    初级 开大括号不能放在单独的一行 未使用的变量 未使用的Imports 简式的变量声明仅可以在函数内部使用 使用简式声明重复声明变量 偶然的变量隐藏Accidental Variable Shadow ...

  6. AWS Ubuntu部署EMQTT的小坑

    Redis身份认证中的 is_superuser 表示不查检用户密码和ACL规则 如果是Ubuntu,集群设置节点名须改为:ubuntu@私有Ip,安全组最好相互开放所有端口 如果使用了ELB,EMQ ...

  7. springboot 整合jdbcTemplate

    springboot 整合jdbcTemplate 〇.搭建springboot环境(包括数据库的依赖) 一.添加依赖 如果导入了jpa的依赖,就不用导入jdbctemplete的依赖了jpa的依赖: ...

  8. xdebug参数说明

    ;;;;;;;;;;;;;;;;;;;;;;;;; Basic Features; xdebug基本功能,如堆栈跟踪,递归错误安全输出,时间内存跟踪等;;;;;;;;;;;;;;;;;;;;;;;;; ...

  9. Mac-sublime text 3破解版

    在史蒂芬周下载破解版 安装package control import urllib.request,os,hashlib; h = 'df21e130d211cfc94d9b0905775a7c0f ...

  10. sql 获取字符串首字母,循环

    //字符串首字母 CREATE FUNCTION GetInitialLetter(@ChineseString NVARCHAR()) RETURNS NVARCHAR() AS BEGIN DEC ...