第8章 缓冲区对象
8.1 缓冲区
- 8.1.1 创建缓冲区
- 8.1.2 填充缓冲区
- 8.1.3 像素缓冲区对象
- 8.1.4 缓冲区对象
8.2 帧缓冲区对象
8.2.1 如何使用FBO
FBO(帧缓冲区对象)
8.2.2 渲染缓冲区对象
RBO(渲染缓冲区对象)
8.2.3 绘制缓冲区
两步:
- 着色器输出:设置写入什么输出
- 缓冲区映射:输出被引导到正确的位置
我们没有理由一定要将来自gl_FragData[0]的颜色输出映射到GL_COLOR_ATTACHMENT0。
我们可以以我们希望的方式进行混合,或者如果不需要片段着色器的某个输出的话,可以在绘制缓冲区列表设置一个到GL_NONE的入口。
在如图所示的示例映射中,第一个着色器输出被路由到第一个FBO颜色缓冲区绑定,而第二个着色器输出则被路由到第3个颜色缓冲区绑定。第3个着色器没有被路由到任何缓冲区,而第4个颜色缓冲区没有接受任何着色器输出。
我们可以通过glDrawBuffers设置一个映射数量的限制值。我们可以通过调用以GL_MAX_DRAW_BUFFERS为参数的glGetIntegerv查询支持的最大映射数
8.2.4 帧缓冲区的完整性
检查是否正确设置,是否可以使用
- 绑定完整性
- 帧缓冲区完整性
8.2.5 在帧缓冲区中复制数据
blit 像素数据从一点移动到另外一点
复制的区域则是由以(srcX0, srcY0)和 (srcX1, srcY1)为顶点的矩形,mask和filter添加滤镜和蒙版
8.2.6 FBO综合运用
多buffer特效基础
8.3 渲染到纹理
纹理绑定到FBO上,示例实现镜面反射效果
第9章 高级缓冲区
9.1 缓冲期数据操作
- 9.1.1 映射缓冲区
- 9.1.2 复制缓冲区
9.2 控制像素着色器表现
映射片段输出
9.3 新一代硬件的新格式
3D应用程序灵活性支持:图形管线自定义、灵活的缓冲区应用、灵活的数据格式
- 9.3.1 浮点——最终的真正精确
HDR(High Dynamic Range) 高动态范围:
可以使得明亮区域真正明亮起来,阴影部分保持阴暗,同时还可以看清区域中的细节。
OpenEXR图像,是由不同曝光等级下拍摄的多幅图像的混合,低曝光捕捉高亮区域细节,高曝光捕捉阴暗区域的细节
HDR图像展示示例(感觉很硬核的渲染机制)
- 9.3.2 多重采样
削减锯齿边缘
- 9.3.3 整数
增强GPU的通用计算能力
sRGB
增强颜色表示范围,满足视觉敏感度的要求。
使用了线形伽马渐变,sRGB存在内建的扩展动态范围
颜色输出转换:sRGB变换公式
- 9.3.5 纹理压缩
纹理压缩减少数据量大,读写的负载
纹理压缩算法、共享指数(GL_RGB9_E5格式:9位的颜色存储位,5位在通道通用指数)
第10章 片段操作:管线的终点
渲染管线,逐片段/像素操作
10.1 裁剪——将几何图形剪切到希望的大小
10.2 多重采样——消弱锯齿
处理方式
- 样本覆盖值(亚像素覆盖了多大区域,确定有多少个样本更新这个片段)
- 样本遮罩位(是否启用映射到的样本)
综合运用
10.3 模板操作
喷涂过滤出来的位置
模版函数、模版操作
10.4 深度测试
经过深度测试的留下,否则丢弃
- 深度测试
与观察者的距离,多个像素在同一位置绘制时,进行Z值比较,绘制
- 深度截取
尽量保留多的Z轴方向的几个图形,保留远端切面还要远的…
10.5 混合
- 混合函数
决定了源颜色和目标颜色从哪里获取。通常源颜色来自当前绘制的图形,目标颜色来自已有的帧缓冲区。常见的选项有源颜色等于源alpha、目标颜色等于1-源alpha等。
- 混合方程式
决定了新颜色如何从源颜色和目标颜色混合生成,是控制混合方式的方程。常见的有加法混合(默认)、减法混合、反转减法混合、最小值混合等
- 综合运用
10.6 抖动
颜色输出需要转换才能存储。
转换方式:
- 简单的映射到最大正颜色
0.3222 => 256中的82、83; 关闭抖动则为83;
- 对结果抖动
将过渡的边缘柔和化,而不是突然的改变。
抖动将颜色过渡进行混合。上半年未处理,下半部分经过噪声混合
10.7 逻辑操作(不是很普遍)
10.8 遮罩输出
- 10.8.1 颜色
- 10.8.2 深度
- 10.8.3 模板
- 用途
用深度信息绘制阴影区域,屏蔽颜色写入;
绘制贴花时,可以关闭深度写入,防止深度数据被污染。
第11章 高级着色器应用
- 11.1 高级顶点着色器
- 11.1.1 在顶点着色器中进行物理模拟
- 11.2 几何着色器
- 11.2.1 直通几何着色器
- 11.2.2 在应用程序中使用几何着色器
- 11.2.3 在几何着色器中丢弃几何图形
- 11.2.4 在几何着色器中修改几何图形
- 11.2.5 在几何着色器中生成几何图形
- 11.2.6 在几何着色器中改变图元类型
- 11.2.7 由几何着色器引入的新图元类型
- 11.3 高级片段着色器
- 11.3.1 片段着色器中的后期处理——颜色校正
- 11.3.2 片段着色器中的后期处理——卷积
- 11.3.3 在片段着色器中生成图像数据
- 11.3.4 在片段着色器中丢弃工作
- 11.3.5 逐片段控制深度
- 11.4 更高级的着色器函数
- 11.4.1 插值和存储限定符
- 11.4.2 高级内建函数
- 11.5 统一缓冲区对象
- 11.5.1 建立统一块
- 11.6 小结
- 第12章 高级几何图形管理
- 12.1 查询功能——收集OpenGL管线相关信息
- 12.1.1 准备查询
- 12.1.2 发出查询
- 12.1.3 取回查询结果
- 12.1.4 使用查询结果
- 12.1.5 让OpenGL决定
- 12.1.6 测量执行命令所需时间
- 12.2 在GPU内存中存储数据
- 12.2.1 使用缓冲区存储顶点数据
- 12.2.2 在缓冲区中保存顶点索引
- 12.3 使用顶点数组对象来组织缓冲区
- 12.4 高效地绘制大量几何图形
- 12.4.1 组合绘制函数
- 12.4.2 使用图元重启对几何图形进行组合
- 12.4.3 实例渲染
- 12.4.4 自动获得数据
- 12.5 存储变换的顶点——变换反馈
- 12.5.1 变换反馈
- 12.5.2 关闭光栅化
- 12.5.3 使用图元查询对顶点进行计数
- 12.5.4 使用图元查询的结果
- 12.5.5 变换反馈的应用实例
- 12.6 裁剪并确定绘制内容
- 12.6.1 裁剪距离——自定义裁剪空间
- 12.7 在OpenGL开始绘制时进行同步
- 12.8 小结