在我们的实际项目中根据实际情况,我们的建筑采用了2D面片的方式,但因为我们的英雄是3D模型,同时策划有需求,英雄可以在主城里面走动。这个时候就给我们提出了一个比较麻烦的问题,我们知道正常情况下渲染是谁的渲染队列高谁渲染在上面,我们这里英雄的Render Queue是2900,建筑面片的Render Queue是2800.渲染结果就会是下图的样子。

我们希望的是2D的建筑能正确的遮挡3D模型。

模型在建筑前面时又可以正常显示

也就是在部分区域可以遮挡模型,其它区域不遮挡模型。
但是这样的需求,单Pass是没有办法实现的。
我们只能考虑多Pass Shader来实现。
也就是一个Pass正常渲染,一个pass去实现固定区域去遮挡所有物体。
因为Shader Graph不支持多Pass shader的编写。我们这次就不再提供Shader Graph的连接图。
先直接上Shader ,后面我们再讲解一下整个的工作原理。
下面是建筑的shader,模型的shader我们使用前面的示例shader即可。
Shader "Unlit/DayNightBuildingDayNight"
{
Properties
{
[NoScaleOffset]_MainTex("MainTexture", 2D) = "white" {}
_Color("NightColor", Color) = (0, 0, 0, 0)
[NoScaleOffset]_Control("Control", 2D) = "white" {}
_RCut("RCut",Float)=0.01
_GColor("GColor", Color) = (0, 0, 0, 0)
_BColor("BColor", Color) = (0, 0, 0, 0)
_Speed("Speed", Float) = 10
}
HLSLINCLUDE
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.h

本文介绍了在Unity的URP中解决2D建筑遮挡3D模型的问题。通过使用多Pass Shader,结合ZWrite和ZTest指令,调整渲染顺序和使用clip函数控制遮挡区域。文章详细分析了每个Pass的功能,包括第一个Pass用于建筑遮挡和ColorMask的运用,以及如何通过单张贴图的R通道实现遮挡控制。
最低0.47元/天 解锁文章
418

被折叠的 条评论
为什么被折叠?



