第九章片段处理与帧缓冲

  • 前言
  • 一、片段着色器
  • 二、单片段测试
    • 1.裁剪测试
    • 2.模板测试
    • 3.深度测试
  • 三、颜色输出
    • 1.颜色混合
    • 2.逻辑运算
    • 3.颜色遮罩
  • 四、离屏渲染
    • 1.多个帧缓冲附件
    • 2.分层渲染
    • 3.帧缓冲的完整性
    • 4.立体渲染
  • 五.反混叠(抗锯齿)
    • 1.过滤法反混叠
    • 2.多样本反混叠(MSAA)
    • 3.多样本纹理
    • 4.采样率着色
    • 5.重心采样
  • 六、高级帧缓冲格式
    • 1.无附件渲染
    • 2.浮点帧缓冲
    • 3.整数帧缓冲
    • 4.sRGB颜色空间
  • 七、点精灵
    • 1.点纹理化
    • 2.渲染星空
    • 3.点参数
    • 4.有型点
    • 5.旋转点
  • 八、获取图像
    • 1.从帧缓存中读取
    • 2.帧缓冲之间复制数据
    • 3.读取纹理数据

前言

本章主要介绍后端,介绍光栅化后的所有操作,包括数据处理,提高图像质量,高动态范围渲染,抗锯齿,可以渲染的替代颜色空间

一、片段着色器

简述:片段着色器设置顶点的颜色,光栅化阶段会进行插值,生成插值片段,可以通过存储限定符控制是否插值
(1)禁用插值:
flat in vec4 foo; 这个为平场输入,存储限定符为flat,说明是禁用插值
smooth in vec4 foo; 这个为平滑输入,存储限定符为smoot,说明是使用插值
前端与片段着色器的存储限定符插值必须匹配
使用平场输入,渲染基元为线条和三角形时,使用第一个或则最后一个顶点,(使用void glProvokingVertex()来确定)
(2)无透视校正插值
简述:三角形所在的平面与我们视线不是垂直时,会产生插值错误,因为屏幕空间的补偿不是线性相关的
透视校正默认启动
noperspective存储限定符,使用线性插值,不使用透视校正,会影响纹理效果

二、单片段测试

1.裁剪测试

裁剪测试和视口裁剪类似,不同的是:
(1)几何图形不会直接从裁剪矩形裁剪,而是针对每个片段进行测试
(2)默认禁用的
(3)要注意glClear()和glClearBufferv()清除帧缓冲

2.模板测试

简述:就像在裁剪好的硬纸板喷漆一样,裁剪了的部分喷漆可以通过,形成图案。
一般8位
glEnable(GL_STENCIL_TEST):启用模板测试
glStencilFuncSeparate()、glStencilFunc():设置是否通过的条件
glStencilOpSeparate()、glStencilOpI():设置通过后的操作

3.深度测试

简述:将现有的片段进行深度测试
glEnable(GL_DEPTH_TEST):启用全局深度测试
glDepthMask():设置部分(特定对象)是否进行深度测试
glDepthFunc():设置通过深度测试的条件
glEnable():启动深度夹紧,可以优化近平面的裁剪

一般先运行片段着色器,再运行模板测试和深度测试
设置布局限定符(depth_any、depth_less、depth_greater、depth_unchanged)可以先运行深度测试,在运行片段着色器

三、颜色输出

简述:在屏幕显示颜色,是片段被写入帧缓存前最后一个管线阶段

1.颜色混合

glEnable(GL_BLEND):开启
glBlendFunc()、glBlendFuncSeparate():设置混合函数
glBlendColor():用来设置混合函数最后一个值常量混色
双源混合。。。
glBlendEquation()、glBlendEquationSeparate():混合方程
what?????

2.逻辑运算

不常用。。。
glLogicOp():计算终值操作

3.颜色遮罩

简述:对颜色缓存应用遮罩,如同模板缓冲和深度缓冲一样
glColorMask()(禁用和启用写入缓冲)、glColorMaski()
应用:深度信息填充阴影卷、贴图时防止污染深度数据

四、离屏渲染

简述:用自定义的帧缓冲代替默认帧缓冲

1.多个帧缓冲附件

简述:可以将多个纹理附加到单个帧缓存并同时使用单个片段着色器渲染到该帧缓存的多个纹理中
注意:glDrawBuffers()这个是复数

2.分层渲染

区别于上面的是:它可以把不同状态的纹理添加到单个帧缓存并显示,具体gsLayered清单示例

立方体贴图是数组纹理的一个特例,特别函数:glFramebufferTexture2D()

3.帧缓冲的完整性

简述:帧缓冲设置好,不意味着可以进行渲染写入
(1)附件完整性
确定模板格式是否可以渲染可以调用:glGetInternalformativ()

(2)全帧缓存完整性
使用这个函数来检查,GLenum fboStatus = glCheckFramebufferStatus()
读取帧缓冲也必须完整

4.立体渲染

简述:通过分别给两只眼睛提供图像提高图像的景深感

五.反混叠(抗锯齿)

混叠是欠采样数据的伪影(就是锯齿)

1.过滤法反混叠

简述:启用GL_LINE_SMOOTH可以对线框抗锯齿;使用GL_POLYGON_SMOOTH可以对几何体边缘抗锯齿,但是在内部边缘锯齿会明显

2.多样本反混叠(MSAA)

简述:增加每个像素的采样频率
glEnable(GL_MULTISAMPLE)

3.多样本纹理

简述:创建一个多采样纹理并将其附加到帧缓存对象进行渲染
GL_TEXTURE_2D_MULTISAMPLE、GL_TEXTURE_2D_MULTISAMPLE_ARRAY
glTextureStorage2DMultisample()、glTextureStorage3DMultisample()

样本覆盖率:片段“覆盖”的像素占比
如何生成?
一种方法是:通过启用GL_SAMPLE_ALPHA_TO_COVERAGE,将片段透明度值直接转换成覆盖率值
另一种:在片段着色器明确设置该信息,内置变量gl_SampleMaskIn[]和gl_SampleMask[]

4.采样率着色

简述:整个着色器将以采样率运行
glEnable(GL_SAMPLE_SHADING)
void glMinSampleShading()

5.重心采样

简述:仅适用于多采样帧缓存情形的抗锯齿优化
重心存储限定符centroid(在“前端着色器”创建,输入到片段着色器,保持一致)
使用重心采样是实现的边缘检测:只能够标记大多数边缘像素

六、高级帧缓冲格式

简述:寻找适用于自定义帧缓冲的高级纹理格式

1.无附件渲染

帧缓冲可以没有附件,但是要使用glFramebufferParameteri()来设置帧缓冲对象参数,还可以在片段着色器使用imageStore()写入内存和atomicCounterIncrement、atomicCounterDecrement函数增加和降低原子计数器

2.浮点帧缓冲

简述:纹理精度位浮点型,提高纹理存储精度,可以应用HDR、镜头光晕等效果
(1)色调映射
可以把超过1.0的数据映射到0-1.0之间
(2)高光溢出
通过设置亮度界限来是实现泛光的效果(其中要使用分离式高斯滤波器)

3.整数帧缓冲

简述:整数精度纹理附加到帧缓冲
片段着色器输出应与附件的类型相匹配
分量宽度小于32位,要不就是舍弃其他最高有效位,要不就是通过压缩函数把浮点转换成整数
出现的问题:不适用于混合;整数内部格式的存在意味着无法通过过滤图像被渲染到的最终纹理

4.sRGB颜色空间

简述:因为光的输出与电压的关系是高度非线性的,所以要使用伽马校正
帧缓冲可以使用sRGB内部格式创建纹理,但是sRGB帧缓存附件的写入不能是线性数据,不过opengl可以使用开启GL_FRAMEBUFFER_SRGB将片段着色器输出的颜色值自动转换成非线性的数据

七、点精灵

简述:点精灵通常指纹理点,就是把点纹理化,制作粒子系统

1.点纹理化

把顶点变成2d纹理

2.渲染星空

示例starfield

3.点参数

简述:使用glPointParameteri()可以把点变成在2D平面内的多边形图形,点精灵坐标原点因惯例应设置为GL_LOWER_LEET

4.有型点

同上

5.旋转点

简述:通过三角函数,使2D平面内的图形生成旋转的视觉效果

八、获取图像

简述:实现打印图像、截图和截屏、后台截图和截屏、离线进程等等

1.从帧缓存中读取

简述:帧缓存数据的读取
使用glReadPixels()函数读取帧缓存数据(默认默认帧缓存),使用glMapBufferRange()并使用GL_MAP_READ_BIT设置映射缓存,使用glReadBuffer()指定读取的附件或设置默认帧缓存附件
写入时,按照y坐标的升序从左到右读取写入,glPixelStorei()改变此设置

2.帧缓冲之间复制数据

简述:通过位块快速复制数据
glReadBuffer():数据源
glDrawBuffer():当前绘制帧缓存的绘制缓存(目标缓存)
glReadPixels():将帧缓冲的数据读入应用程序的内存(缓存对象),效率低
glBlitFramebuffer():将帧缓存读入另一个帧缓存
glCopyTexSubImage2D()和glCopyTextureSubImage2D():复制数据到纹理,从帧缓存获取数据源
glCopyImageSubData():将纹理数据复制到另一个纹理,如果复制时要改变纹理尺寸,则使用glBlitFramebuffer()

3.读取纹理数据

简述:直接从纹理读取数据到应用程序的内存(缓存),机制与glReadPixels相似
glGetTexImage()和glGetTextureImage():直接从纹理读取图像数据
glGetTextureSubImage():读取一小片纹理
示例:调用glGenerateMipmap(),用较高分辨率的mip映射填充较低分辨率的mip映射,或者可以从着色器直接写入图像,再读取图像

OpenGL超级宝典(第7版)之第九章片段处理与帧缓冲相关推荐

  1. 《OpenGL超级宝典第5版》学习笔记(一)—— 第一个OpenGL程序

    // GLTools库包含了一个用于操作矩阵和向量的3D数学库,并依靠GLEW获得OpenGL3.3中用来产生和渲染一些简单3D对象的函数, // 以及对视觉平截头体.相机类和变换矩阵进行管理的函数的 ...

  2. OpenGL超级宝典第7版环境配置

    1.下载源码 地址:http://www.openglsuperbible.com/ 2.运行Cmake,编译glfw库 打开项目后,编译工程(Debug和Release下都编译). 把E:\open ...

  3. OpenGL超级宝典(第7版)笔记4 渲染管线介绍 清单2.3-2.7

    OpenGL超级宝典(第7版)笔记4 渲染管线介绍 清单2.3-2.7 文章目录 OpenGL超级宝典(第7版)笔记4 渲染管线介绍 清单2.3-2.7 1 OpenGL简介 2 OpenGL渲染管线 ...

  4. OpenGL超级宝典(第五版)环境配置

    本文转自:http://blog.csdn.net/sunny_unix/article/details/8056807,感谢作者分享. OpenGL超级宝典(第五版)环境配置 Vs2008+winX ...

  5. OpenGL超级宝典(第五版)环境配置【转】

    OpenGL超级宝典(第五版)环境配置 Vs2008+winXP  后续会整理Ubuntu 12.04LTS下的配置作者:sunny_unix 1.各种库的配置 (1)glew 下载:https:// ...

  6. OpenGL超级宝典(第五版) 环境配置

    特别提醒:有些在word中或者其他中的代码复制到vs中会报错,原因是word中有些隐含的字符,复制到vs中就会报错:重新输一遍就可以解决问题,这里只是提醒下! 可以参阅我前面转载的一篇文章,进行比较然 ...

  7. OpenGL超级宝典(第五版) 环境配置(WinXp+VS2008)

    转自:http://blog.csdn.net/sunny_unix/article/details/8056807 OpenGL超级宝典(第五版)环境配置 1.各种库的配置 (1)glew 下载:h ...

  8. [转]OpenGL超级宝典 5e 环境配置

    OpenGL超级宝典(第五版)环境配置 1.各种库的配置 (1)glew 下载:https://sourceforge.net/projects/glew/files/glew/1.7.0/glew- ...

  9. OpenGL超级宝典学习笔记——操作矩阵

    为了更强大的功能和灵活性,我们有时需要直接操作矩阵.在OpenGL中4x4的矩阵用包含16个浮点数值的一维数组来表示,而不是用二维的4x4的数组来表示.OpenGL之所以这么做,因为使用一维数组更高效 ...

  10. win7 上配置openGL开发环境(配套openGL 超级宝典Super Bible 6th)

    此教程配套openGL 超级宝典super Bible圣经 第六版基于最新openGL4.3,但只有英语版 第六版比第五版(第五版目前有中文版基于openGL3.2)跨了一个时代,改变非常巨大,所以笔 ...

最新文章

  1. MyBatis 之 动态SQL
  2. 简单理解AOP(面向切面编程)
  3. linux 远程图形终端,图形终端远程操作Linux
  4. C语言 FileStreaming 键盘与屏幕IO
  5. (转)Python 字符串格式化 str.format 简介
  6. FFMPEG增加和提取字幕流
  7. 基于Starling移动项目开发准备工作
  8. 第1节 kafka消息队列:5、javaAPI操作
  9. 客户端VS2010 Team Foundation Server中删除项目
  10. java大于0的正则_求一个 大于0且小于1 的正则表达式(无论几位小数)
  11. 淘宝有什么方法可以一键下载淘宝评论免费的
  12. 关于ActionForm的一些问题
  13. ps太卡怎么办?几步帮您解决问题
  14. win7禁用驱动签名验证_如何在64位Windows 8或10上禁用驱动程序签名验证(以便可以安装未签名的驱动程序)...
  15. 计算机网络设备的运行温度,计算机机房控制温度与湿度方法
  16. EAS 从查询分析器导出表数据的插入语句
  17. 311 稀疏矩阵的乘法
  18. docker+阿里云镜像服务
  19. [数据结构与算法]-二叉查找树(BLT)介绍及其实现(Java)
  20. 按键精灵---句柄的介绍及获取

热门文章

  1. c语言程序由哪三个部分组成部分,C语言程序的组成部分
  2. PDF文档阅读必备的PDF阅读器
  3. 《EDA技术与Verilog HDL设计》第4、5 章读书笔记与总结
  4. 网页内嵌多媒体内容的完美实现
  5. 图书管理系统源代码<Java>(带文字讲解)(javase)
  6. mapxtreme 常用实例
  7. 数字信号处理实验(六)—— 心电信号处理 IIR FIR滤波综合题(下篇)
  8. mt4 谐波_MT4指标AB=CD Dashboard — AB = CD 谐波模式仪表盘指示器
  9. 使用RoboCopy 命令
  10. JavaScript 函数的length