RTR4:图形渲染管线 v0.01

第二章

  • 功能:给定相机,对象,光源等生成二维图像。是实时渲染的底层工具
  • 本章重点是功能性介绍,不涉及实现

2. 1 架构

  • 每个阶段都是并行的,阶段和阶段也是并行的
  • 应用→几何处理→光栅化→像素处理
  • FPS与 s/frame 更新频率,赫兹用于显示器的表示
  • 概述:
    • 应用阶段:碰撞检测,全局加速,动画,物理模拟等(依赖于具体实现
    • 几何处理:变换,投影,绘制(什么,在哪,如何)
    • 光栅化:生成三角形,找像素
    • 像素处理:颜色,测试,混合

2.2 应用阶段

  • 将图元:点,线,三角等送给几何阶段处理
  • 进一步:ch18.5 优化该阶段无法并行的问题
  • 其他功能:碰撞检测,处理输入,加速算法(如ch19 剔除算法

2.3 几何处理

  • 顶点着色→投影→剪裁→屏幕映射

2.3.1 顶点着色器

  • 任务:计算位置以及其他位置数据(如法线,纹理坐标

  • 作用:设置动画 ch4.4 ch4.5

  • 坐标空间

    • 模型空间(可通过实例化生成多个模型而不用复制几个几何图形
    • 模型变换:顶点和法线
    • 世界空间
    • 视图变换
    • 相机空间:轴的约定方向(x右,y上,z看情况
  • 任务:顶点着色(可以是任何和着色结果有关的信息 ch3 ch5

  • 投影(正交或透视)

    • 矩阵构建 ch4 与表示:通常以矩阵表示以和其他几何变换连接(ch4.7
    • 正交投影的view volume是矩形:转换是平移加缩放
    • 透视投影是视锥体
    • 结果:clip coordinates,是齐次坐标,还未被w除
    • 投影结果:3D→2D,z坐标存在z缓冲区 ch2.5
  • 剪裁:投影后裁剪 -1到1

2.3.2可选的顶点处理

  • 曲面细分→几何着色→流输出 ch3
  • 曲面细分
    • 作用:根据情况生成适量的三角形
    • 组成:外壳着色器,镶嵌器,域着色器
  • 几何着色器
    • 作用:粒子生成,烟花爆炸等(由1个点变成多个点组成的正方形
    • 接受图元产生新顶点
  • 流输出
    • 作用:粒子模拟,如烟花
    • 将处理后的顶点存起来进一步处理

2.3.3 裁剪

  • 只需要立方体内的图元(对应视锥体内的图元
  • 超出部分被丢弃,按情况生成新顶点

2.3.4 屏幕映射

  • 屏幕映射:x,y通过平移+缩放转换为屏幕坐标
  • z坐标
    • OPENGL:-1 到 1
    • DIRECTX:0 到 1
    • 映射到z_1 到z_2 默认0到1,但可设置

如何将整数和浮点数的点映射到像素(和纹理坐标)

  • 设一组水平数组,左边为0,像素中心为0.5

    • 则像素范围[0,9] 覆盖了[0.0,10.0)的范围
  • 转换:

    d=floor(c)c=d+0.5d = floor(c) \\ c=d+0.5

    • d为像素的索引(离散的
    • c为像素(连续的浮点值
  • 像素位置:

    • OPENGL:从左到右,从下到上,零点在左下角
    • DIRECTX:从左到右,从上到下,零点在左上角

2.4 光栅化(扫描转换

  • 三角形设置(原始组装)→三角形遍历
  • 目的:找到图元内部的所有像素,将二维顶点转换为像素
    • 所以虽然说是三角形,但图元可以是点和线
  • 如何判断是否覆盖像素:
    • 取决于管线设置:如设置点采样
      • 最简单的:中心点采样
      • 多个样本超级采样,多重抗锯齿:ch5.4.2
      • 保守光栅化:像素至少一部分重叠 ch23.1.2

2.4.1 三角形设置

  • 计算三角形相关数据
  • 作用:三角形遍历,几何阶段的着色插值

2.4.2 三角形遍历

  • 判断重叠,生成片段,采样方法 ch5.4
  • 生成插值数据:如片段的深度等,如透视插值 ch23.1.1

2.5 像素处理

  • 像素着色→像素合并
  • 对图元内部的像素和样本进行处理

2.5.1 像素着色

  • 作用:根据插值后的着色数据,对每个像素片段进行计算,最终生成一种或多种颜色到下一阶段
  • 应用:纹理 ch06

2.5.2 合并

  • 颜色缓冲区:存储像素信息的数组
  • 作用
    • 将计算生成的颜色和缓冲区的合并起来
    • 可见性设置
  • 深度缓冲区与z-buffer算法
    • 大小形状与颜色缓冲区相同
    • 算法:离相机近(近的定义可设置),即比缓冲区的值小则写入
    • 算法复杂度 On
    • 弱点:透明物体无法表示
      • 解决方法:先绘制不透明的图元,再从后到前绘制透明图元
      • 或采用与顺序无关的算法 ch5.5
  • alpha通道:与颜色缓冲区相关联,提供不透明值
    • 作用:老API中提供alpha测试来丢弃片段
    • 应用:现在可以在像素着色器中丢弃
    • 保证完全透明的片段不会影响z缓冲区
  • 模板缓冲区
    • 大小通常为每个像素8位
    • 应用:利用操作符实现类似于模板的效果

一些api提供raster order views, also called pixel shader ordering, 像素着色器排序,支持可编程混合功能

帧缓冲区与双缓冲技术

  • 帧缓冲区由上述缓冲区组成
  • 双缓冲技术:当图元达到并通过光栅化阶段时,从相机的角度可见的图元将显示在屏幕上。屏幕显示颜色缓冲区的内容。为了避免让人类查看者在图元被光栅化并发送到屏幕时看到它们,使用了双缓冲

进一步

参考:ch5.4.2 ch23.6 ch23.7

总结

  • 这里介绍的是实时渲染管线,不是唯一的渲染管线
  • 离线渲染管线有别的发展方向,但目前是光追和路径追踪 ch11.2.2

参考

  • 顶点着色器:1049
  • 三角形遍历:1162
  • 透视插值:649
  • 深度缓冲区与z-buffer算法:238
  • 离线的伪多边形管线:289 1734

进一步:

  • 软件渲染器的实现 165
  • 图形管道与相关算法 885
  • realtimerendering 对应参考

习题

  1. 什么是图形渲染管线,分为那些阶段?
  2. 描述图形渲染管线每个阶段的具体任务?