[TOC]
参考视频:
整体概括
渲染管线在计算机图形学当中可以说是必须了解的,在视频当中大致分为 应用阶段 、几何阶段、光栅化阶段、 逐片元操作、后处理
应用阶段
应用阶段主要是 cpu为我们准备一些所需要的数据和一些粗粒度的剔除,主要操作如下
准备基本场景数据
- 场景物体数据
a. 物体变换数据,位置、旋转、缩放
b. 物体网格数据、顶点位置、uv贴图 - 摄像机数据(fov near far)
a. 位置、方向,远近裁切平面
b. 正交/透视(fov)
c. 视口比例/尺寸等 - 光源信息和阴影数据
a. 光源类型,方向光、点光、聚光(每个灯光种类的一些信息)
b. 位置、方向、角度等其他参数
c. 设置阴影:是否需要阴影,光源可见范围是否有可投射阴影的物体、阴影参数,对应光源序号、阴影强度、级联参数、深度偏移、***面偏移等
d. 逐光源绘制阴影贴图:***面偏移、绘制阴影贴图等 - 其他全局数据
- 场景物体数据
加速算法、粗粒度剔除
- 碰撞检测
- 遮挡剔除
- 加速算法
a. 可见光裁剪
b. 可见场景物体裁剪:八叉树、BSP树、K-D树、BVH - 其他算法
- 参考 渲染前CPU和渲染中GPU的裁剪和剔除(转载) 为什么在ndc归一化坐标已经包含了视锥体剔除功能的情况下 还需要视锥体裁剪?
设置渲染状态,准备渲染参数
- 绘制设置 (不同物体 有不同的shader)
- 合批方式(动态 静态)
- 绘制顺序(透明和不透明物体的渲染顺序)
- 相对摄像机距离
- 材质RenderQueue
- UICanvas 等
- 渲染目标(渲染之后把结果输出到 Render Texture 或者 framebuffer
- 渲染模式(Forward 或者是 Deferred )
- 绘制设置 (不同物体 有不同的shader)
调用DrawCall 输出渲染图元到显卡
- 顶点数据(位置,颜色,发现,uv坐标等)
- 其他数据(MVP矩阵、纹理贴图等)
几何阶段
几何阶段主要分为以下几个步骤:顶点着色器(视图变换,顶点着色)、可选顶点处理(几何、曲面细分)、投影(透视、正交)、裁剪(CVV,正面或者背面剔除)、屏幕映射(连续到离散,坐标系差异DX/openGL)
顶点着色器
- 模型空间->世界空间->摄像机空间->投影空间(视锥体裁剪)->视口变换 (自动完成)
- 顶点色
曲面细分/几何
- 曲面细分生成更多的顶点
- 几何可以生成各种形状的图元类型
投影
OpenGL(-1 ~ 1 ) D3D(0 ~ 1) w的分量是把物体映射到这个区间内
- 正交投影
a. 大小一样 - 透视投影
b. 近大远小
- 正交投影
裁剪
- 裁剪是GPU自动裁剪,不需要我们手动操作
屏幕映射
- OpenGL 屏幕坐标 左下到右上
- D3D 屏幕坐标 左上到右下
光栅化阶段
光栅化主要分为两个阶段 1. 三角形设置 2. 三角形遍历
- 三角形设置
- 设置边界信息
- 三角形遍历
a. 得到三角形的边界信息之后,扫描所有像素,得到所覆盖的三角形所有片元(此刻屏幕上的这个片元可能会有多个三角形的片元重合)
b. 对三角形内的片元进行插值 - 抗锯齿
a. SSAA 渲染分辨率放大N倍 对放大N倍的buffer下采样
b. MSAA 光栅化阶段 计算多个覆盖样本
c. FXAA/TXAA 后处理技术
逐片元操作
逐片元操作主要分为以下几个步骤:片元着色(PS)、 颜色混合 (透明测试,深度测试,模板测试,blending) 参考链接、 目标缓冲区
- 片元着色
- 三个顶点进行线性插值
- 颜色混合- 透明度测试
- 小于透明度阈值的舍弃
- 颜色混合-深度/模板测试 参考链接
- 深度值和深度缓冲做对比,舍弃比较大的
- 混合 参考链接 (unity shader 入门精要中也有详细的解答)
后处理
后处理 主要是对输出的缓冲区/渲染贴图进行处理 最常见的 Bloom,HDR,FXAA,边缘检测,运动模糊等等
参考文章
GPU Rendering Pipeline——GPU渲染流水线简介
GLSL-几何着色器详解跟实例(GS:Geometry Shader)
其他
个人能力有限,如有不对的地方请及时指出,相互进步,创作不易请多多支持~