前情提要
有了开篇的渲染管线和渲染流水线的基本概念,接下来先从原理上看看渲染流水线是怎么运作的,然后再看看UnityURP是对应是怎么实现的,最后再看UnityURP是怎么构建渲染管线,逐层探索剖析。本篇作为渲染流水线的主线文章,将列举渲染流水线中的各个阶段,将数据到图像的每一步处理步骤都列出,每个阶段的具体的详细讨论在后续相应的文章链接中展开详解。
(对渲染的探索是个持续不断完善的过程,记录这个过程将零散的内容整理起来,其中肯定会有理解偏差和问题,如果哪里有问题,欢迎在评论区探讨和指出)
基于URP默认的渲染路径:前向渲染Forward 来讲解基本的渲染流水线
渲染路径 概念在最后会讲解,默认的前向渲染路径就是最通用的复合常规的渲染流水线中的流程,其他路径都是优化特定情况而出现的,先用前向的学习后再看其他的渲染路径。
渲染流水线(Rendering Pipeline)中可编程或可配置阶段,按顺序执行:
应用阶段 -〉几何阶段 -〉 光栅化阶段 -〉逐片元阶段 -〉输出
应用阶段(CPU)包括(包围盒裁剪、遮挡剔除、其他裁剪算法等)
几何阶段(GPU)包括(顶点着色器(可编程)、细分着色器(可选)、几何着色器(可选)、图元装配(固定)、裁剪(固定)、归一化设备坐标(透视除法;固定)、屏幕映射(固定))
光栅化阶段(GPU)包括(光栅化(三角形设置、三角形遍历;固定)、片元着色器(可编程))
逐片元阶段(GPU)包括((可见性测试Scissor、多重采样测试)透明度测试、模版测试、深度测试、深度写入、混合)(全可配置)
接下来详细列出渲染流水线的阶段索引
应用阶段
几何阶段
-
关键顺序:
- 顶点着色器输出齐次裁剪坐标(如
UnityObjectToClipPos
返回值)。 - GPU执行裁剪(依赖
w
分量的动态范围)。 - 透视除法触发归一化,生成NDC坐标供屏幕映射
模型空间 →(Model矩阵)→ 世界空间 →(View矩阵)→ 观察空间 →(Projection矩阵)→ 裁剪空间→(透视除法)→ NDC空间 →(视口变换)→ 屏幕空间
- 其中模型空间到裁剪空间是在顶点着色阶段运算的。(在顶点着色器中手动用MVP矩阵进行左乘计算)
- NDC空间是归一化时做的 (GPU自动计算)
- 屏幕空间是屏幕映射阶段做的 (GPU自动计算)
-
顶点着色器(Vertex Shader)
-
可选阶段:曲面细分着色器(Tessellation Shader)
-
可选阶段:几何着色器(Geometry Shader)
-
图元装配
-
裁切
-
归一化设备坐标(Normalized Device Coordinates, NDC)
-
屏幕映射
光栅化阶段
-
光栅化
-
片元着色器(Fragment Shader)
逐片元阶段
-
逐片元操作(Per-Fragment Operations)
-
深度偏移(Slope Scale Depth Bias)
-
渲染顺序与层级
Unity中基于SRP的URP渲染管线
-
SRP提供的核心功能与架构
-
URP在SRP上的具体实现
-
URP对SRP的扩展与简化
-
对URP的扩展
-
URP中的渲染路径选择
其他
-
URP中实时阴影计算流程
-
计算着色器(Compute Shader):GPU 通用计算,可并行处理非图形任务(需单独编写)。
-
后处理(Post-Processing):屏幕空间特效(如 Bloom),通过 URP Renderer Feature 添加。
-
投影Projector。
-
平面阴影
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)