TA百人计划 图形 1.1 渲染流水线

整体流程

  1. 应用阶段:粗细度剔除,进行渲染设置,准备基本数据,输出到几何阶段。(CPU阶段)
  2. 几何阶段:顶点着色器,曲面细分,几何着色器,顶点裁剪,屏幕映射。(GPU阶段)
  3. 光栅化阶段:三角形(点/线)设置,三角形(点/线)遍历,片段着色器。(GPU阶段)
  4. 逐片元操作:裁剪测试,透明度测试,深度测试,模板测试,混合。(GPU阶段)
  5. 后处理。

每个阶段环环相扣,前一个阶段的输出作为后一个阶段的输入。

应用阶段

该阶段准备的是场景,对象的基本数据。例如场景里面的物体他们的位置朝向,大小以及物体对应的模型里边每一个顶点的位置、法线、切换等,再比如场景光源的位置朝向和一些基本的属性,还有摄像机的位置朝向等。

  1. 准备基本场景数据
    1. 场景物体数据
    2. 摄像机数据
    3. 光源信息
    4. 可见光裁剪
    5. 可见场景物体裁剪
    6. 其他全局数据
  2. 加速算法、粗粒度剔除
    1. 碰撞检测
    2. 加速算法
    3. 遮挡剔除
    4. 其他算法
  3. 设置渲染状态、准备渲染参数
    1. 绘制设置
    2. 绘制顺序
    3. 渲染目标
    4. 渲染模式
  4. 调用 DrawCall、输入渲染图元到显存
    1. 顶点数据
    2. 其他数据

基本场景数据

  1. 场景物体数据
    1. 物体变换数据:位置、旋转、缩放等
    2. 物体网格数据:顶点位置、UV 贴图
  2. 光源信息
    1. 光源类型:方向光、点光、聚光等
    2. 位置、方向、角度等其他参数
  3. 摄像机参数
    1. 位置、方向
    2. 远近裁剪平面
    3. 正交 / 透视
    4. 视口比例 / 尺寸等
  4. 可见光裁剪
  5. 可见场景物体裁剪
    1. 八叉树
    2. K-D
    3. BVH

光源和阴影

  1. 设置光源
    1. 方向光:颜色、方向等
    2. 点光源:颜色、位置、范围等
    3. 聚光源:颜色、位置、方向、内外圆锥角等
  2. 设置阴影
    1. 是否需要阴影:判断该光源可见范围内是否有可投射阴影的物体
    2. 阴影参数:对应光源序号、阴影强度、级联参数、深度偏移、近平面偏移等
  3. 逐光源绘制阴影贴图
    1. 近平面偏移
    2. 逐级联
      1. 计算当前光源+级联对应的观察矩阵、投影矩阵,以及对应到阴影贴图里的视口区域
      2. 绘制到阴影贴图

渲染设置

  1. 绘制设置
    1. 合批方式
  2. 绘制物体的顺序(可以有多种方式)
    1. 相对摄像机的距离
    2. 材质 RenderQueue
    3. UICavas
    4. 其他方式等
  3. 渲染目标
    1. FrameBuffer
    2. RenderTexture
  4. 渲染模式
    1. 前向渲染
    2. 延迟渲染

输出到显存

  1. 顶点数据
    1. 位置
    2. 颜色
    3. 法线
    4. 纹理 uv 坐标
    5. 其他顶点数据
  2. 其他数据
    1. MVP 变换矩阵
    2. 纹理贴图
    3. 其他数据

几何阶段

  1. 顶点着色

    来源:顶点数据来自于cpu。

    主要工作:坐标变换、逐顶点光照。

    GPU在每个输入的网格顶点上都会调用顶点着色器。顶点着色器必须进行顶点的坐标变换,需要时还可以计算和输出顶点的颜色。

    顶点着色器会将模型顶点的位置变换到齐次裁剪坐标空间下,进行输出后再由硬件做透视除法得到 NDC 下的坐标。

    1. 视图变换

    2. 顶点着色

  2. 可选顶点处理

    1. 曲面细分

      通过现有顶点生成更多顶点(需要知道现有顶点在模型里的现有信息)。

    2. 几何着色器

      通过现有的图元来做一些几何方面的操作,生成更多的顶点和图元(例如对现有图元的顶点生成法线)

  3. 投影

    1. 正交
    2. 透视
  4. 裁剪

    主要工作:裁剪掉那些不在摄像机视野范围的物体(不需要被处理)

    只有在单位立方体的图元才需要被继续处理。因此,完全在单位立方体外部的图元(红色三角形)被舍弃,完全在单位立方体内部的图元(绿色三角形)将被保留。和单位立方体相交的图元(黄色三角形)会被裁剪,新的顶点会被生成,原来在外部的顶点会被舍弃。

    Untitled-8.png

    1. cvv
    2. 正面或者背面剔除(可配置)
  5. 屏幕映射

    主要工作:把每个图元的 坐标转换到屏幕坐标系 (Screen Coordinates) 下

    1. 从连续到离散
    2. 坐标系差异(OpenGL/D3D)

光栅化阶段

  1. 三角形设置

    来源:三角网格的顶点数据

    主要工作:计算三角网格表示的数据

  2. 三角形遍历

    也叫作扫描变换

    主要工作:检查每个像素是否被 个三角网格所覆盖。如果被覆盖的话,就会生成一个片元 (fragment) 。

    三角形遍历的过程。根据几何阶段输出的顶点信息,最终得到该三角网格覆盖的像素位置。对应像素会生成一个片元,而片元中的状态是对三个顶点的信息进行插值得到的。

  3. 抗锯齿

    1. SSAA
      1. 渲染到一个分辨率放大 n 倍的 buffer
      2. 对放大 n 倍的 buffer 下采样
    2. MSAA
      1. 在光栅化阶段
      2. 计算多个覆盖样本
    3. FXAA / TXAA
      1. 后处理技术,不在这个渲染阶段

逐片元操作

操作对象变成了光栅化操作输出的片元数据,片元即为屏幕上的一个着色点。

对于所有片元进行一系列测试(透明度测试、深度测试、模板测试),通过的保存否则遗弃。

  1. 像素着色

    输入:输入是上 个阶段对顶点信息插值得到的结果。

    输出:是一个或者多个颜色值。

  2. 颜色混合

  3. 目标缓冲区

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇