Unity URP中的Single

您所在的位置:网站首页 Urp渲染什么手机能跑 Unity URP中的Single

Unity URP中的Single

2024-06-29 06:38| 来源: 网络整理| 查看: 265

什么是URP相信大家都已经看过了很多的文章,这里就不再向大家详细解读URP了,只是简单的提一下:大家都知道,一直以来,unity使用的都是一套内置的渲染管线,全部写在引擎的源码里,大家基本不会能改动,所以过去的管线对于开发者来说,是很难进行定制的。而且对unity官方团队而言,应该也有很大负担,因为他们要在一个渲染管线里支持几十种平台,例如PC,主机,手机等,越来越多的平台支持无疑会使这套代码越来越臃肿,很难兼顾效率和效果,所以unity推出了一套新的基于脚本的渲染管线SRP(可编程渲染管线),主要把渲染管线拆分成两层:一层是比较底层的渲染API,另一层是渲染管线比较上层的描述,上层的代码使用C#来编写。在C#这层不需要关注底层在不同平台渲染API的差别,也不需要关心据图如何做一个Draw Call。

unity基于SRP提供了两套模板:一个是轻量级渲染管线LWRP(在unity2019.3中正式更名为URP(通用渲染管线)),一个是高清晰渲染管线HDRP。 高清渲染管线HDRP是全部基于Compute Shader,基于最新的硬件来开发的,可以达到顶尖的渲染效果。例如Unity的官方演示项目《异教徒》,它的效果非常惊艳。 另外一个渲染管线URP,主要是为了移动平台设计,也就是最流行的手机游戏平台,它可以达到更高的效率,然后可定制性也更好。

而我们在阅读官网URP文档,与内置渲染管线做对比的时候,会发现很重要的一个不同点就是,URP采用了Single-Pass的渲染方式。

我们知道Pass块的作用就是 Pass块使游戏对象的几何图形被渲染一次。我们可以找一个最简单明了的多pass效果来看一下,那就是unity下的毛发效果:Unity下的毛发效果

我们打开任意一个shader代码,就可以看到下边有超级多的pass块进行不断的渲染,所以才会呈现出多层mesh,也就是毛发的效果,每个shader都会进行一次渲染,所以我们在Unity的界面下就可以看到一个普通的球体,拥有了多层mesh,然后通过改变透明度,颜色等实现了毛发的效果(这里就不详细介绍毛发效果是如何实现了,有机会单独介绍)

 

 

    

我们可以把毛发相关的代码放在URP的工程下面,发现不管我们怎么调节毛发材质的选项,都只有一层mesh,打开framedebugger看一下渲染过程。我们可以断定,pass块只执行了第一个。

我们刚才已经了解到了,内置渲染管线支持多pass渲染处理,也就是刚才我们看到的毛发效果,但是urp下只支持single pass的处理方式,这个single-pass第一眼觉得是URP下的shader只能有一个pass块,但这样理解肯定是不对的,我们随便点开一个URP下的官方shader,都可以看到每个shader中都有好多pass块,分别用来渲染阴影等,而且每个pass块都打上了lightmode标签。那我们可以猜测,是不是我们在pass块中给每个pass块都设定一个lightmode标签,就可以执行了?我们可以试一下,给第一个pass块一个tag标签UniversalForward(URP渲染下的一个lightmode标签)。

之后再回到Unity,打开framedebugger看一下渲染过程,

发现此时已经进行了两次pass块的渲染,一个pass的标签是UniversalForward,另一个则么有标签,那我们再在第二个pass块上加上一个tag标签UniversalForward,再看一下framedebugger

可以看到此次渲染的是第0个和第2个,其中第0个pass块和第1个pass块都是相同的标签UniversalForward,我们把第一个pass块的tag标签换成SRPDefaultUnlit(URP下的标签之一)

可以看到两个pass都被正常渲染,而且两个pass的标签分别为UniversalForward和SRPDefaultUnlit。

那么我们现在应该可以猜到URP下的Sungle-Pass的渲染方式,应该指的是,相同的Tags标签,只会被执行一次,而不是说一个shader里面只能有一个Pass块。

那么URP下的标签又是在哪里定义的呢?我们可以在Packages文件夹下找到URP相关的代码,在DrawObjectsPass这个脚本下,发现有tag标签被加进了标签队列中

当然URP本质上就是SRP的一个模板,例如DrawObjectsPass这样的脚本我们完全可以自己去编写,来定义自己的渲染管线,我们现在可以尝试在DrawObjectsPass下,把一些我们自己定义的Tag标签名字加进去,例如

然后再毛发shader中添加我们自己的标签,发现被添加了Test1和Test2标签的pass块也都被正常执行了。(补充:最多只允许16个ShaderTag)

(以上均为博主自己的理解,如有错误,还麻烦在评论区指出,大家一起探讨研究)。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3