学习教程来自:【技术美术百人计划】图形 1.1 渲染流水线
渲染管线
通过一系列的处理,将3D元素转换为2D图像。工作流程是线性的
0.整体路程
- 应用阶段
- 几何阶段
- 光栅化阶段
- 逐片元阶段
- 后处理
1.应用阶段
1.1.基本场景数据
- 场景物体数据:Transform(位置、旋转、缩放)+网格数据(顶点位置、UV、法线、切线等)
- 摄像机数据:参数(位置、朝向、远近裁剪面、透视方式、比例)
- 光源数据:类型(方向光等)+参数(位置、方向、角度等)
- 阴影数据:是否需要阴影、阴影参数(对应官员、强度、级联参数、深度偏移、近平面偏移等)
- 其他全局数据
1.2.优化:算法加速、剔除
- 碰撞检测
- 加速算法
- 遮挡剔除(粗略):裁剪光源、物体(八叉树、BSP树、K-D树、BVH树)
- 其他
1.3.设置渲染状态、准备渲染参数
- 绘制设置:着色器、合批方式
- 绘制顺序:例如透明物体的渲染顺序,方式包括:摄像机距离、RenderQueue、UICanvas等
- 渲染目标:RenderTexture、FrameBuffer
- 渲染模式:前向渲染、延迟渲染等
技美知识学习3400:延迟渲染
1.4.调用DrawCall
输出带有渲染数据的图元,交给GPU处理
- 顶点数据:位置、颜色、法线、UV等
- 其他:MVP变换矩阵、纹理贴图等
2.几何阶段
顶点着色->可选项点处理->投影->裁剪->屏幕映射
2.1.顶点着色器
顶点变换:模型空间->世界空间->相机空间->投影空间->屏幕空间
顶点着色
2.2.可选项点处理
- 曲面细分着色器:根据上一步输出的顶点,按照规则和算法,生成更多的顶点
- 几何着色器:基于图元的操作,生成更多图元
2.3.投影
不同的投影方式有不同的W值,都转换到NDC中
补充:
- OpenGL:-1 ~ 1 xyz
- D3D:-1 ~ 1 xy 0 ~ 1 z
2.4.裁剪
遗弃在坐标外的图形,为横跨的图形重新生成顶点
2.5.屏幕映射
将上一步的坐标值映射到屏幕的坐标系中
- OpenGL:(0,0)在左下方
- D3D:(0,0)在左上方
3.光栅化阶段
3.1.三角形设置
Triangle Step
计算图元边界信息的过程
3.2.三角形遍历
Triangle Traversal
寻找被三角形网格覆盖的所有像素的过程,插值得到每一个片元的信息