学习教程来自:【技术美术百人计划】图形 1.1 渲染流水线

渲染管线

通过一系列的处理,将3D元素转换为2D图像。工作流程是线性的

0.整体路程

  1. 应用阶段
  2. 几何阶段
  3. 光栅化阶段
  4. 逐片元阶段
  5. 后处理

1.应用阶段

1.1.基本场景数据

  1. 场景物体数据:Transform(位置、旋转、缩放)+网格数据(顶点位置、UV、法线、切线等)
  2. 摄像机数据:参数(位置、朝向、远近裁剪面、透视方式、比例)
  3. 光源数据:类型(方向光等)+参数(位置、方向、角度等)
  4. 阴影数据:是否需要阴影、阴影参数(对应官员、强度、级联参数、深度偏移、近平面偏移等)
  5. 其他全局数据

1.2.优化:算法加速、剔除

  1. 碰撞检测
  2. 加速算法
  3. 遮挡剔除(粗略):裁剪光源、物体(八叉树、BSP树、K-D树、BVH树)
  4. 其他

1.3.设置渲染状态、准备渲染参数

  1. 绘制设置:着色器、合批方式
  2. 绘制顺序:例如透明物体的渲染顺序,方式包括:摄像机距离、RenderQueue、UICanvas等
  3. 渲染目标:RenderTexture、FrameBuffer
  4. 渲染模式:前向渲染、延迟渲染等
    技美知识学习3400:延迟渲染

1.4.调用DrawCall

输出带有渲染数据的图元,交给GPU处理

  1. 顶点数据:位置、颜色、法线、UV等
  2. 其他:MVP变换矩阵、纹理贴图等

2.几何阶段

顶点着色->可选项点处理->投影->裁剪->屏幕映射

2.1.顶点着色器

顶点变换:模型空间->世界空间->相机空间->投影空间->屏幕空间
顶点着色

2.2.可选项点处理

技美知识学习3300:TESS and GS

  1. 曲面细分着色器:根据上一步输出的顶点,按照规则和算法,生成更多的顶点
  2. 几何着色器:基于图元的操作,生成更多图元

2.3.投影

不同的投影方式有不同的W值,都转换到NDC中

补充:

  1. OpenGL:-1 ~ 1 xyz
  2. D3D:-1 ~ 1 xy 0 ~ 1 z

2.4.裁剪

遗弃在坐标外的图形,为横跨的图形重新生成顶点

2.5.屏幕映射

将上一步的坐标值映射到屏幕的坐标系中

  1. OpenGL:(0,0)在左下方
  2. D3D:(0,0)在左上方

3.光栅化阶段

3.1.三角形设置

Triangle Step

计算图元边界信息的过程

3.2.三角形遍历

Triangle Traversal

寻找被三角形网格覆盖的所有像素的过程,插值得到每一个片元的信息

3.3.抗锯齿

  1. SSAA:先成倍增加像素,再下采样
  2. MSAA:引进遮挡测试和深度测试来选择是否需要计算和保存当前片元
  3. FXAA/TXAA:后处理操作

    4.逐片元操作

    4.1.片元着色

    Fragment Shader 可编程

    对片元着色

    4.2.颜色混合

    Color Blending 可配置

    混合同一像素上的多个片元

    进行透明度测试、深度测试(深度值的比较方式和是否写入缓冲)、模板测试(同深度测试),通过测试的进行混合

    4.3.目标缓冲区

    输出到Frame Buffer或者Render Texture

    5.后处理

    Bloom HDR FXAA Depth of View 边缘检测 径向模糊等