URP 渲染顺序设置 RenderObjects

如下图,URP默认Shader的设置中,已经没有了以往的Render Queue的设置。

   

那么我们要如何来控制渲染顺序呢?

我们先简单的搭建一个测试场景,在场景中创建两个Cube,使其位置重叠,将其中一个命名为RedCube。然后新建一个默认的Material(即shader为URP/Lit),设置Base Map的颜色为红色,将该material挂到RedCube上即可。

如上图,按照默认的渲染顺序我们只能看见灰色的方块。

Priority属性

在Material中有一个名为Priority属性,修改其值可以来改变material的渲染顺序,值越小,渲染的越晚。

我们将RedCube的Priority值设置为-1,可以发现我们可以看见红色小块了,因为其渲染在灰色小块的后面。

这么简单?No!

当我们把红色小块往后移一点,发现摄像头变得依旧只能看见灰色小块了。因此Priority属性似乎只有在深度测试(Z Test)相同的情况下才能起到效果。

Render Objects

使用URP后,会在Project Settings的Graphics关联一个URP的asset文件,在其Renderer List中,会默认关联一个Forward Render的asset文件,其内容如下。

  

在Renderer Features中点击小加号,添加一个Render Objects,在这里我们就可以进行一些渲染上的处理了。

Event 可以设置在Render的哪个阶段触发效果
Queue 设置影响的是不透明物体还是透明物体
Layer Mask 设置影响的Layer层
Depth 开启后可以设置深度写入和深度测试
Camera 重新设置camera效果

此时我们Layer Mask选择Default,勾选Depth,Depth Test选Disabled(关闭深度测试),如下左图

    

此时的效果图如上右图,摄像机可以看见红色方块,但是有莫名其妙的黑影,这其实是灰色小方块的阴影。将小方块的Case Shadows选为Off,此时显示就正常了,红色方块显示在了前面(注意红色方块的Priority依旧要低于灰色的)

拓展

我们此时再新建一个material,取名GreenAlphaPanel,将其Surface Type选为Transparent,Blending Mode为Alpha这样就可以通过调整Base Map颜色的透明度影响物体的透明度。然后我们在红色方块下面添加一个Panel,设置合适的大小,并使用我们前面的GreenAlphaPanel。同时适当的放大灰色小块,方便测试。由于我们期望的效果是红色方块现在在最前面,然后是绿色的面片,最后是灰色大块,因此它们三个的Priority值应该是红色<绿色<灰色。效果图如下

    

可以发现我们的绿色面片并没有和红色小块一样显示在前面,这是因为我们之前的设置只影响不透明物体,因此我们需要再新建一个RenderObjects来影响透明物体,效果如下

  

可以发现虽然绿色的透明面片显示出来了,但是却覆盖了红色方块,因此我们还需要调整一下设置。由于现在三个物体的Layer都一样,防止相互影响,我们新建一个Layer层名为Building,将红色方块和绿色面片设置为该Layer。由于默认情况下,透明物体会在不透明物体后面渲染,因此我们要让不透明的红色方块渲染在透明的绿色面片之后的话,需要修改其Event,使其在透明的设置之后,例如选择After Rendering Transparents。最终效果如下:

        

更多知识点还需后续研究补充。

猜你喜欢

转载自blog.csdn.net/wangjiangrong/article/details/106146544