在我们的实际项目中根据实际情况,我们的建筑采用了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