c0d3n4m 发表于 2022-11-4 10:20

请问Unity不同的渲染管线的区别是什么?

LWRP、URP、HDRP这三者有什么区别?又和Unity默认的渲染管线差别在哪里?原来我以为只是PBR流程的区别,后来查了一些资料发现也不对。目前我个人查到的资料都是单独去说某一个管线,要么就是HDRP开发3A,说的也很笼统,没有很具体说出来区别在哪,比如HDRP为什么适合开发3A级别,他的优势事什么?由于我刚接触Unity不久,听的也是云里雾里,所以希望有前辈来简单说一下这几个管线的区别。或者能提供一些资料我自己去研究看看,希望资料不要太深入晦涩,能浅显易懂一点。感谢!

kirin77 发表于 2022-11-4 10:28

Unity 可编程渲染管线, LWRP轻量级渲染管线(Light Weight Render Pipeline)出来有一段时间了, 今天写一遍文章,详细的介绍一下可编程渲染管线与LWRP轻量级渲染管线相关内容,帮助大家搞懂这些概念,并建立起一个学习可编程渲染管线/轻量级渲染管线的思维。整个文章我将会分成4个部分来个大家讲解:


对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习unity的零基础小白,也有一些正在从事unity开发的技术大佬,欢迎你来交流学习。
每个Unity版本,实现的轻量级渲染管线LWRP的代码可能都不一样,但是思路原理基本都差不多。
1: 什么是渲染管线与向前渲染
   我本人非常反对高大上的概念包装,唯独游戏中的"渲染"是例外之一。通俗点说渲染就是烘托出相应的环境(光照,阴影,遮挡,反射,折射等),把物体在特定的环境中绘制出来。Unity引擎里把引擎中完成整个游戏场景,人物, 环境,光照等游戏画面绘制相关,最终把画面绘制到屏幕上的整套逻辑与相关代码(普通代码与Shader代码)称为渲染管线。


早期的Unity引擎,把整个渲染管线都内置在引擎里面,没有开放给开发者,只有少数的一些大厂,获得了Unity引擎源码授权,能修改和定制里面的渲染管线相关代码。Unity内置的渲染管线有: 向前渲染,延时渲染等,目前这两种用的比较多。Unity引擎默认使用"向前渲染"。接下来我说一下向前渲染管线中的一个渲染策略,为了后面对比轻量级渲染管线做好铺垫。向前渲染管线可以处理任意多的光源,处理多光源的时候,每个重要光源,都会调用一次Shader里面的Pass来完成渲染,有几个重要光源就会渲染几次,这样大大降低了多光源时候的绘制效率。所以之前我们很多手机游戏上面都用静态光照来渲染场景,获得逼真的光照效果,因为向前渲染管线多光源的实时计算开销实在太大。静态光照有一个问题就是无法获得实时光照的效果。
2: 什么是可编程渲染管线


3: 轻量级渲染管线与它的基本使用
内置的渲染管线是针对通用情况,比如支持任意数目的光源等,所以很多策略并不是特定的环境下,针对特定应用场景而得到的最佳的策略,现在手机游戏非常的广泛,还有很多其它的游戏平台,需要好的渲染效果的同时,需要一个好的性能。比如我就希望有多光源的实时光照,我的角色到了光源附近能渲染出光的效果出来,而不是使用静态光照那样。同时我们又不需要任意多的光源,只要限定一个光源数目即可,比如4个。这样就可以通过定制渲染管线,提升性能,比如我们最多支持4个光源,我把所有光源的计算一起放到一个Pass里面,这样提升性能的同时,又获得实时的光照,虽然对光源的数目做了一些限制(轻量化),却获得了效果和性能的一个灵活的平衡。Unity 针对手游等应用领域,开发了轻量级渲染管线(LWRP),后来基于轻量级渲染管线又衍生出来另外一个渲染管线Universal Render Pipeline(URP,这边文章我们用的是URP的代码)。
渲染管线的渲染策略被定制了,渲染的时候需要Shader来配合最终绘制物体出来,所以不同的渲染管线Shader会不一样,我们之前学习的Shader开发都是针对向前渲染管线的,比如轻量级渲染管线所有光照计算都在一个Pass,那么之前向前渲染的Shader肯定就不能直接使用了。所以当我们定制了新的渲染管线以后,还要基于新的渲染管线的策略重新开发一个Shader包(PBR Shader, 粒子, 雾,天空盒等),这个Shader包能满足大部分的3D游戏开发的需求,同时我们也可以基于新的渲染管线的策略来开发自己的Shader。
   总结一下定制渲染管线的主要的3个点:


完全从头到尾定制一个渲染管线并不容易,幸运的是Unity引擎为我们做好了轻量级的渲染管线,满足我们做手机游戏的绝大部分的需求。我们只要使用就可以了,如何使用轻量级渲染管线,这里我们已URP为例:

[*]安装URP的相关的Unity Package, 不同的Unity的版本可能URP的代码版本不一样。
(2) 使用URP渲染管线来代替内置的渲染管线。先创建一个渲染管线的Asset文件,配置好相关数据,创建成功后,在Grpahics下面的Scriptable Render Pipeline选择这个Asset文件,切换渲染管线成功。系统会根据Asset文件的描述来创建出渲染管线出来。如图:


   (3) 创建角色,场景,创建材质的时候,使用渲染URP渲染管线相关的Shader;
   4: 轻量级渲染管线Shader 模板结构




仍然是基于ShaderLab, 和普通的Shader结构,没有区别。
我们来看几个重要的Pass, 体会一下和向前渲染管线的不同。先来看主要的绘制Pass,处理光照计算的,正如红线标注的一样,所有的光源在一个Pass里面计算完成。


看下阴影投射的Pass:


看下HLSL代码,和Cg差不多,所以学习的时候不用由心里负担, 打开LitForwardPass.hlsl,这个文件就是URP里面PBR Shader具体实现的代码。截图如下,数据结构这些和Cg没有太大的差别,如图:


由于篇幅有限,没有办法把Shader详细代码的讲解一遍,为此我还提供了本文对应的代码与视频讲解(里面详细讲解了Shader结构),需要的可以进入学习小组,回复"LWRP",来学习免费学习视频教程,并获取课程源码。 URP渲染管线效果截图如下:

Zephus 发表于 2022-11-4 10:31

前向 延迟
shader计算 复杂度不同,hdrp用了更多 复杂算法做效果

super1 发表于 2022-11-4 10:41

urp可以非侵入式自定义渲染流程

RecursiveFrog 发表于 2022-11-4 10:49

1、默认渲染管线。默认渲染管线就是你不装LWRP、UPR、HDRP这些管线,Unity本来就内置的管线。这个管线只是Unity对底层渲染API(如OpenGL等)做了简单封装搞出来的,并且当时Unity并没有去考虑这个管线的可定制性。尽管可以用CommandBuffer和一些渲染时的回调来对这个管线的渲染流程做一些修改,但个人感觉都是些比较骚的操作,搞出来的东西稳定性不是很好。所以默认渲染管线的问题就是死板。
2、SRP。即可编程渲染管线。这玩意相当于是对默认渲染管线又做了层封装,并暴露给用户。这大大提高了渲染管线的可定制性。SRP把渲染管线细分成一个个模块和过程,你只需要按照自己的需求去组装和重写即可。比如我用SRP可以先渲染出场景中一部分物体,然后做个后处理,再渲染剩下的物体,在做其它后处理等等。
2、LWRP。这玩意就是Unity用SRP给你写的一个渲染管线。如果用户觉得自己没有太多的渲染管线定制需求,也不想花很多时间在管线的编写上的用户,那直接就可以用这个LWRP来替代默认渲染管线。并且LWRP也具有一定的可定制性。
3、URP。就是LWRP的升级版。给LWRP改改BUG、优化些体验、用些底层新特性、提高渲染质量这样。
4、HDRP。没怎么了解过。个人理解应该还是用SRP搞得,但是一些东西就重写了,使其能够支持光追这些现代图形学的东西。
总之这些东西就是太多人觉得Unity的默认管线不能满足自己的需求,而自己去定制或者说修改这个默认管线又很麻烦。所以Unity在迭代升级的过程中就诞生了SRP,并配套产生了LWRP、URP和HDRP这些管线。

HuldaGnodim 发表于 2022-11-4 10:57

我们知道渲染3D物体需要考虑,物体着色,光照计算,环境光,阴影计算, 传递哪些数据, 自定义的Shader等,渲染管线,就是定义了处理这些的原理原则,在这些原则下渲染游戏场景中的物体。
这里有个unity学习交流小组 大家可以一起学习交流
   Unity的渲染管线分为3大类渲染管线:
    (1) 向前渲染管线;
    (2) 延时渲染管线;
    (3) 可编程渲染管线;
(1),(2)是Unity引擎内置的渲染管线,来处理整个场景的绘制和渲染相关机制,(3)允许开发者自己定义,这样能获得更好的灵活性和效率。

   接下来说说内置向前渲染管线和延迟渲染管线的区别, 可编程渲染管线就不说了。比如向前渲染管线,每个重要光源,都要经过一次Pass,来渲染一次物体,不重要的光源,在ForwardBase里面计算等,而延时渲染就是先把所有的光照计算出来,最后再渲染("延时")。不同的渲染管线,对应的技术处理的策略不一样。
具体还要在学习每种渲染管线的处理原则和机制。
页: [1]
查看完整版本: 请问Unity不同的渲染管线的区别是什么?