求知若饥,虚心若愚
应用阶段
准备基本场景数据
- 场景物体数据
- 物体变换数据:位置、旋转、缩放等(在Unity中即Transform组件的数据)
- 物体网格数据:顶点位置、UV贴图、法线、切线等
- 摄像机数据
- 位置、方向
- 远近裁剪平面
- 正交、透视(FOV)
- 视口比例、尺寸等
- 光源及阴影数据
- 光源类型:方向光、点光、聚光、区域光等
- 位置、方向、角度等其他数据
- 是否需要阴影:判断该光源可见范围内是否有可投射阴影的物体(物体shader要能投射)
- 阴影参数:对应光源序号、阴影强度、级联参数、深度偏移(Bias相关,涉及shadowmap精度)、近平面偏移等
- 逐光源绘制阴影贴图:
- 近平面偏移
- 逐级联
- 计算当前光源+级联对应的观察矩阵、投影矩阵、以及对应到阴影贴图里的视口区域
- 绘制到阴影贴图
- 其他全局数据
加速算法、粗粒度剔除
- 碰撞检测
- 加速算法(加速场景物体的裁剪)
- 八叉树
- K-D树
- BVH
- 遮挡剔除
- 可见光裁剪,灯光有衰减,以及范围
- 可见场景物体裁剪,视锥体(平头截体)外、被遮挡的物体
- 其他算法
设置渲染状态、准备渲染参数
- 绘制设置
- 合批方式:静态合批、动态合批、GPU Instancing
- 绘制顺序(会影响Overdraw)
- 相对摄像机的距离排序
- 材质RenderQueue排序
- UICanvas排序
- 其他方式等
- 渲染目标
- FrameBuffer
- RenderTexture
- 渲染模式
- 前向渲染
- 延迟渲染
- Tile Based?
调用DrawCall、输出渲染图元到显存
- 顶点数据
- 位置
- 颜色
- 法线
- 纹理uv坐标
- 其他顶点数据
- 其他数据
- MVP变换矩阵
- 纹理贴图
- 其他数据
几何阶段
顶点着色器Vertex Shading(可编程)
- 视图变换(可以看下引用里的投影矩阵推导)
- Model - View - Projection - Screen
- model space -> world space -> camera space -> clip space -> NDC -> screen space
- 顶点着色
- 一般在这里计算传给下一阶段的数据
- 也可在这一阶段进行着色,被称为Gouraud shading
可选项点处理(可编程)
- 曲面细分(可选)
- 将较少的面通过特定算法增加更多的顶点从而细分成更多的面
- GAMES101_Lecture_12有讲解相关的算法
- 几何着色器(可选)
- 在图元外增加额外的Vertex,将原始图元转换成新图元,以构建一个不一样的模型
- (粒子系统)只用一个Vertex来表示每一个颗粒:只需要在GeometryShader阶段将每个Vertex拓展成两个三角形
投影Projection
- 正交
- 透视
裁剪Clipping(可配置)
- CVV(视锥体裁剪)
- 正面或背面剔除(可配置)
屏幕映射ScreenMapping(GPU自动完成)
- 从连续到离散
- 坐标系差异(OpenGl、Direct3D)
光栅化阶段
三角形设置 Triangle (GPU自动完成)
将对应面的三个顶点组装成三角形,计算图元的边界信息
三角形遍历 Triangle Traversal(GPU自动完成)
- 三角形(图元)包含的片元,利用aabb加速计算,以及线性插值(一般是用重心坐标)对应像素的属性
- 同个像素可能对应多个片元,丢弃和混合颜色后才成为像素
- 补充:线代GPU会使用Quads(四个像素一组),为了方便计算mipmap、各向异性等ddx/ddy,所以一个三角形占用的像素可能会更多
抗锯齿(anti-aliasing)
- SSAA(Super-Sampling Anti-Aliasing)
- 渲染到一个分辨率放大N倍的buffer
- 对放大N倍的buffer进行下采样
- MSAA(Multi-Sampling Anti-Aliasing)
- 在光栅化阶段
- 计算多个覆盖样本,可以通过采样点的分配来降低采样频率以及不用像SSAA那样每个采样点计算一遍着色,所以性能比SSAA好
- FXAA(Fast approximate anti-aliasing)/TXAA(Temporal anti-aliasing)
- 后处理技术,不在这个渲染阶段
逐片元操作
-
像素着色 Fragment Shader(可编程)
- 这个阶段着色的叫Phong Shading(和Phong光照模型区分开)
-
颜色混合 ColorBlending(可配置)
- Alpha Test
- Depth Buffer Test
- Stencil Test(配置模板值的写入与对比,根据对比结果来舍弃还是覆盖)
- Blending
-
目标缓冲区
- FrameBuffer
- RenderTexture
后处理
前面的渲染流程完成后,再对最后输出的缓冲区/渲染贴图进行处理,可以看成是应用于一个矩形面片贴图的图像处理
回顾整体流程
引用
- RTR4 第二章 图形渲染管线 - 0110君的文章 - 知乎 https://zhuanlan.zhihu.com/p/208987296
- GPU Rendering Pipeline——GPU渲染流水线简介 - 拓荒犬的文章 - 知乎 https://zhuanlan.zhihu.com/p/61949898
- 卡通渲染(上):致从没看懂过着色器代码的你 - 羡辙的文章 - 知乎 https://zhuanlan.zhihu.com/p/25595069
- 实时渲染中的坐标系变换(5):投影变换-3 - IgorKakarote的文章 - 知乎 https://zhuanlan.zhihu.com/p/115395322
- 实时渲染中的坐标系变换(3):投影变换-1 - IgorKakarote的文章 - 知乎 https://zhuanlan.zhihu.com/p/113662566
- GLSL-几何着色器详解跟实例
- 渲染器 2 —— 三角形的光栅化 - 萧井陌的文章 - 知乎 https://zhuanlan.zhihu.com/p/20148016
- 深度测试/模版测试/透明度测试先后顺序是什么样的? - 林红旭 Leo的回答 - 知乎 https://www.zhihu.com/question/384124671/answer/1121443495
- 渲染前CPU和渲染中GPU的裁剪和剔除 https://blog.csdn.net/qq_33744693/article/details/88704309
- 投影矩阵推导
- 图形学投影矩阵推导 https://www.bilibili.com/video/BV1ZY41157TR
- GAMES101第四讲 https://www.bilibili.com/video/BV1X7411F744
- learnopengl https://learnopengl-cn.github.io/
- 大佬的笔记 https://www.bilibili.com/read/cv13282376
- 大佬的笔记 https://www.yuque.com/xiaohen-ecwjj/vegbg9/mmmfg8
v1.5.2