1、帧缓冲对象

帧缓冲对象对于离屏渲染、纹理贴图更新、缓存乒乓技术(buffer ping-pongqing,GPGPU的一种数据传输方式)的实现意义非凡,它减少了大量的数据拷贝工作。

建立帧缓冲需要负责建立帧缓冲使用的其它缓冲内容,也就是说,新建的帧缓冲只是一个空壳,具体的渲染缓冲对象被称之为帧缓冲附件。下面是一个简单的可用帧缓冲建立示例:

帧缓冲是比较消耗内存的,所以OpenGL提供了可以将帧缓冲一部分或者全部无效化从而立即释放内存的操作

void glInvalidFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attackments)//numAttachments是附件的数目,attachments是附件的id

void glInvalidSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attackments, GLint x, GLint y, GLsizei width, GLsizei height)

2、帧缓冲附件

GL_COLOR_ATTACHMENTi:第i个颜色缓冲,取值范围从0到GL_MAX_COLOR_ATTACHMENT-1

GL_DEPTH_ATTACHMENT:深度缓冲

GL_STENCIL_ATTACHMENT:模板缓冲

GL_DEPTHx_STENCILy_ATTACHMENT:深度缓冲与模板缓冲的压缩格式(x、y是占用的空间以 位 为单位)

需要注意的一点是,GL_DRAW_FRAMEBUFFER GL_FRAMEBUFFER是等价的,只是在字面意义上使用起来会比较鲜明。由上面的帧缓冲示例可以看出,最后一步是检查它的完整性,结果又以下几种:

3、渲染缓冲(render buffer)

渲染缓冲内容的存储格式是是格式化后的图像数据,GPU能够直接使用,因此它是一个高效的内存缓冲。同时它也是依附于帧缓冲,只有被关联到帧缓冲对象之后它才有意义。首先分配存储空间

void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)//target必须是GL_RENDERBUFFER,internalformat是内容的存储格式作为颜色缓冲时应该为下面众多中的一种:

作为深度缓冲、模板缓冲等应该是GL_DEPTH_COMPONENT、GL_DEPTH_COMPONENT16、GL_STENCIL_INDEX、GL_STENCIL_INDEX16、GL_DEPTH_STENCIL等中的一种

void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)//samples是多采样的数目

4、多重缓冲

帧缓冲对象的多渲染缓冲特性是在一个fragment shader中同时写入多个缓冲的能力,也叫MRT(Multiple-Render Target)渲染,能够避免对统一组数据进行多次光栅化等行为。常被用于GPGPU领域,也能能够用于生成几何体或其它信息(如纹理、法线贴图)。fragment shader中使用layout区分多缓冲,如下:

layout (location = 0) out vec4 normal;

layout (location = 1) out vec4 color;

建议在shader中使用layout限定符来确保输出与帧缓冲的附件互相关联,否则OpenGL会在shader的链接阶段完成这项工作。也可以在代码来进行设置

void glBindFragDataLocation(GLuint program, Gluint colorNumber, const GLchar* name)//colorNumber对应于shader的变量name

void glBindFragDataLoactionIndexed(GLuint program, Gluint colorNumber, GLuint index, const GLchar* name)//index的取值只能是0或1(没理解这是干啥的???)下面是api英文说明

设置正确,shader程序链接完成后可以通过下面方法获取索引、位置

GLint glGetFragDataLocation(GLuint program, const GLchar* name)

GLint glGetFragDataIndex(GLuint program, const GLchar* name)

1)选择颜色缓冲进行读写

绘制或读取通常与下面几种颜色缓冲内容关联:(1)默认帧缓冲的前、后、左前、左后、右前、右后

(2)自定义帧缓冲的前缓冲,或是任意渲染缓冲附件

void glDrawBuffer(GLenum mode)//model是上面的关联内容,有GL_FRONT、GL_LEFT、GL_BACK_LEFT等,如果当前绑定的帧缓冲不是默认的,只能使用GL_NONE或者GL_COLOR_ATTACHMENTi

void glDrawBuffers(Glsizei n, const GLenum* buffers)//buffers只接受GL_NONE、GL_FRONT_LEFT、GL_FRONT_RIGHT、GL_BACK_LEFT、GL_BACK_RIGHT这几种

2)双源融混

同一个片元的两个输出作用于同一个帧缓冲中的同一个颜色缓冲,通过fragment shader的第二个输出量实现。

layout (location = 0, index = 0) out vec4 first_output;

layout (location = 0, index = 1) out vec4 second_output;

混合(blend)时glBlendFunc等设置状态使用GL_SRC_COLOR、GL_SRC_ALPHA、GL_ONE_MINUS_SRC_COLOR等时,这些参数作用于第一个输出first_output;GL_SRC1_COLOR、GL_SRC1_ALPHA等则会作用于第二个输出second_output。

双源融混的实现使用了fragment shader第二个输出,同时这个变量可能关联到多个帧缓冲附件上,因此fragment shader的总输出变量数目会减少,需要对GL_MAX_DUAL_SOURCE_DRAW_BUFFERS进行查询,如果为1,说明这两种功能只能取其一使用。

OpenGL 编程指南 (3.2)的更多相关文章

  1. OpenGL编程指南(第七版)

    OpenGL编程指南(第七版) 转自:http://blog.csdn.net/w540982016044/article/details/21287645 在接触OpenGL中,配置显得相当麻烦,特 ...

  2. 编译opengl编程指南第八版示例代码通过

    最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadS ...

  3. VS15 openGL 编程指南 配置库 triangle例子

    最近去图书馆借了一本书<OpenGL编程指南(原书第八版)>,今天倒腾了一天才把第一个例子运行出来. 所以,给大家分享一下,希望能快速解决配置问题. 一.下载需要的库文件 首先,我们需要去 ...

  4. [转]OpenGL编程指南(第9版)环境搭建--使用VS2017

    1.使用CMake Configure中选择VS2017 Win64 , Finish: 点击Generate. 2.进入build目录 打开GLFW.sln , 生成解决方案. 打开vermilio ...

  5. opengl编程指南

    第一章 opengl简单介绍 1.1 什么是opengl opengl是图形硬件的一种软件接口.        1>渲染(rendering)是计算机依据模型创建图像的过程. 2>模型(m ...

  6. OpenGL编程指南第版本学习笔记 --- OpenGL程序实现过程(win32 + OpenGL)

    1. 先上代码 头文件glCommon.h #include <GL/glew.h> #include <GL/GL.h> #include <GL/GLU.h> ...

  7. OpenGl编程指南第7版(红宝书)环境配制

    环境 OS:win7 旗舰版SP1 64位 编译器: VS 2013 express 的cl 软件 glut. 在这个页面https://www.opengl.org/resources/librar ...

  8. OpenGL编程指南(第九版) Tiangles 学习笔记

    ////////////////////////////////////////////////////////////////////////////// // // Triangles.cpp / ...

  9. 《OpenGL编程指南第七版》学习——编译时提示“error C2381: “exit” : 重定义;__declspec(noreturn) 不同”错误的解决办法

    解决办法一. #if defined(_WIN32) # ifndef GLUT_BUILDING_LIBextern _CRTIMP void __cdecl exit(int); 上面是glut. ...

  10. Opengl编程指南第二章:状态管理、几何绘图

    //http://blog.csdn.net/longhuihu/article/details/7701874 1.绘图基础 清除窗口 glClearColor(0.0, 0.0, 0.0, 0.0 ...

随机推荐

  1. java使用原生MySQL实现数据的增删改查以及数据库连接池技术

    一.工具类及配置文件准备工作 1.1 引入jar包 使用原生MySQL,只需要用到MySQL连接的jar包,maven引用方式如下: <dependency> <groupId> ...

  2. 从应用的角度去学习Python--为孩子下载课本

    最近,孩子上课都没有课本,老师给发的是一个微信链接,打开看可以,打印打不全.怎么办?我就想既然能看,从爬虫的角度就一定可以抓下来! 在Chrome中打开网址,好家伙!一堆的Script之类的玩意儿.经 ...

  3. 【巨杉数据库SequoiaDB】巨杉Tech | 分布式数据库千亿级超大表优化实践

    01 引言 随着用户的增长.业务的发展,大型企业用户的业务系统的数据量越来越大,超大数据表的性能问题成为阻碍业务功能实现的一大障碍.其中,流水表作为最常见的一类超大表,是企业级用户经常碰到的性能瓶颈. ...

  4. 【笔记】机器学习 - 李宏毅 - 1 - Introduction & next step

    Machine Learning == Looking for a Function AI过程的解释:用户输入信息,计算机经过处理,输出反馈信息(输入输出信息的形式可以是文字.语音.图像等). 因为从 ...

  5. SQLserver 行变列。

    首先看看效果是不是想要的 变成 ok,我的效果达到了.那就记录下代码吧. create table temp1(count_ int,memo nvarchar(40))go insert into ...

  6. D - Counting Squares

    Your input is a series of rectangles, one per line. Each rectangle is specified as two points(X,Y) t ...

  7. 5.Docker Compose 部署 Harbor

    什么是 Harbor Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器,通过添加一些企业必需的功能特性,例如安全.标识和管理等,扩展了开源 Docker Dis ...

  8. Fastbin attack

    Fastbin Attack 暂时接触到了两种针对堆分配机制中fastbin的攻击方式,double free和house of spirit Double free 基本原理 与uaf是对free之 ...

  9. Mysql注入汇总!!!!!!!!!

    师傅tpl!!!!! https://xz.aliyun.com/t/7169[对MYSQL注入相关内容及部分Trick的归类小结] https://www.jianshu.com/p/f261125 ...

  10. linux--nginx学习

    nginx 1.nginx安装编译 1.yum install nginx(自动解决依赖) 2.源代码编译安装(优秀,自由选择软件版本,自定义第三方功能比如开启https) 3.rpm手动安装(垃圾) ...