快速引导:
既然想探索如何渲染的,那就先看看现有的方案是如何运作的,从顶向下逐层探索。这里选择用UnityURP作为开始的探索的参考,相对会比较容易入手,URP管线的源码都是可见的更容易理解管线到底在做什么。当然也不局限于Unity,OpenGL的参考也是了解其原理的重要途径。
探索路径结构:
先对渲染的整体流程做粗颗粒度的串联。再细化每个阶段具体如何实现和处理。对于使用Unity来讲,有很多流程是固定的,甚至是因为固定必要的硬件级别的实现加速都处理好了。但是对于想要完整知道他是怎么做的来说,Unity的官方介绍文档还是粗糙了很多。所以这里只是以Unity作为探索实践的参考。
(对渲染的探索是个持续不断完善的过程,记录这个过程将零散的内容整理起来,其中肯定会有理解偏差和问题,如果哪里有问题,欢迎在评论区探讨和指出)
开始之前先给出最粗略的渲染流水线
应用阶段 -〉几何阶段 -〉 光栅化阶段 -〉逐片元阶段 -〉输出
在了解这些具体是什么之前,得先了解一些概念。才知道各个文章书中说的这些到底在实践中是什么样的,有个具象的概念,能更好的理解发生了什么。
前置概念
渲染流水线Rendering Pipeline的基本概念:
渲染管线是什么?有哪些内容?在Unity中哪个环节怎么实现的?先参看一下下面的基本的概念简述快速了解它是谁、它在哪、干了什么。
一、Unity URP 渲染管线定义辨析
二、关键差异
维度 | 渲染流水线 | URP渲染管线 |
---|---|---|
层级 | GPU硬件处理图像的底层流程 | Unity引擎实现的高层框架 |
可变性 | 硬件固定的标准流程 | 可通过C#脚本和Shader编程定制 |
优化目标 | 理论执行效率 | 实际项目性能(如移动端帧率) |
Unity中的角色 | 图形学基础概念 | 逐步取代旧版内置管线的新方案 |
三、核心关系
⚠️ 渲染流水线描述图形数据的处理原理,URP则是Unity提供的工程化解决方案,通过优化流水线各阶段执行逻辑提升实际渲染效率
渲染流水线(Rendering Pipeline)
指GPU处理图形数据的标准化流程,包含三个核心阶段:
- 应用阶段(CPU):加载模型/纹理数据到显存,设置渲染状态,发送Draw Call指令
- **几何阶段(GPU):**顶点变换(模型坐标→世界坐标→视图坐标→投影坐标)、光照计算、图元装配
- **光栅化阶段(GPU):**将图元转换为像素,执行片元着色
- 逐片元阶段(GPU):深度/模板测试,输出到帧缓冲区
URP渲染管线(Universal Render Pipeline)
是Unity提供的可编程框架 ,用于组织并优化底层渲染流水线的具体实现:
-
提供预设渲染流程(如前向/延迟渲染路径)
-
通过Shader控制几何与光栅化阶段的可编程环节
-
针对性能优化:减少Draw Call、合并光照计算、简化渲染环节
-
URP是对渲染流水线的封装:它将标准流水线阶段(如顶点处理、光照计算)抽象为可配置模块
-
优化实现:通过动态批处理减少Draw Call次数,合并光源计算降低几何阶段负载,通过SRP Batch 减轻SetPassCall设置渲染状态负担。
-
扩展性:开放Shader接口控制流水线中的关键环节(如几何着色器)
内置与URP渲染管线架构差异对比简述
##### 内置管线(Built-in)
* **固定架构**:采用传统前向/延迟渲染模式,渲染流程不可定制,开发者无法修改核心逻辑。
* **多Pass光照处理**:每个动态光源对物体产生独立Pass,导致DrawCall随光源数量线性增长。
* **功能冗余**:支持全局光照、曲面细分等高级特性,但移动端性能开销大。
##### URP管线(Universal Render Pipeline)
* **模块化架构** :基于SRP(Scriptable Render Pipeline)框架,通过C#脚本控制渲染流程(如`RenderPass`),支持高度定制。
* **单Pass前向渲染** :所有光源在**一个Pass内处理**,显著降低DrawCall。
* **轻量化设计**:默认关闭高开销功能(如视差贴图),专注于跨平台性能优化
#### 渲染流水线和管线中的Pass关系
#### **Pass机制的本质**
**每个Pass并非完整的渲染流水线**,而是流水线中的子阶段:
*** ** * ** ***
#### **关键区别总结**
维度 | 内置管线 | URP |
---|---|---|
流水线架构 | 固定不可修改 | 模块化可编程(C#控制) |
Pass机制 | 多Pass光源(性能开销大) | 单Pass多光源(移动端友好) |
扩展性 | 需修改引擎源码 | 通过RenderPass灵活定制 |
适用场景 | PC/主机高画质项目 | 跨平台/移动端/VR项目 |
误区: "每个Pass=完整流水线" 是错误的。Pass仅是流水线中处理特定任务(如光照)的子阶段,完整流水线包含顶点处理、光栅化、片元着色等全流程。 URP通过单Pass优化降低了光源计算复杂度,但流水线其他阶段(如阴影生成)仍可能涉及多个Pass
- Pass的功能定位 :
- 内置管线 :
Base Pass
处理主平行光+逐顶点光源/SH光照。Additive Pass
逐光源叠加其他逐像素光。
- URP :
- 单Pass完成所有光源计算(Clustered Forward Shading)。
- 通过
SRP Batcher
合并相同Shader的材质,减少GPU数据提交。
- 内置管线 :
- Pass与流水线的关系 :
- 完整流水线包含几何处理→光栅化→像素着色 等阶段,而Pass仅负责光照计算等局部任务。
- URP的
RenderPass
可插入自定义阶段(如后处理、遮挡剔除),扩展流水线功能。
有了渲染流水线和渲染管线的基本概念区分,就可以知道渲染流水线是包含在渲染管线中的一部分,其中GPU部分主要靠Unity的各个功能不同的Pass输出到管线指定的位置。渲染管线是渲染模块中组织这些Pass和其他相关内容一起完成渲染的固定或可编程可配置的渲染组织程序。
渲染流水线的核心概念是通用的,可以抛开管线单独学习。这里为了便于理解,结合Unity URP渲染管线作为实现参考。其中 下面要介绍的应用阶段是在CPU上执行的,其余阶段从几何阶段到最后输出都是在GPU上执行的,并且后面这些阶段也都是在Unity Shader 中的每个Pass中实现的。所以通过了解URP中的各个Pass可以在看到Unity是怎么具体实现的,数据在当中是怎么流转的。当然URP中使用HLSL编写核心Shader代码,相比内置管线中默认用CG来写Shader代码对后期学习也有帮助,毕竟CG已经停止维护了,后面URP也要作为Unity默认渲染管线。
小结
有了以上概念,知道了要探索的内容在实际实践中是以什么样式的存在。那么就可以开始细化每个阶段。
由于每个阶段可能涉及到的内容会很多很负责,主体内容上前期会从渲染流水线为主线,逐步拆解。下一篇会列出渲染流水线中详细的各个阶段作为整体索引。后面各个阶段探索都以此为主要节点展开。
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)
本文由博客一文多发平台 OpenWrite 发布!