OpenGL学习-高级应用

146 阅读6分钟

第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 小结