我正在使用仅模板通道(ColorMask 0ZWrite OffStencil { Ref 1, Comp Always, Pass Replace })来在我的游戏 Pieceful 中为一些棋盘棋子创建透明的“孔洞”。其思路是,当存在孔洞时,玩家应该能够看到棋子背后的物体,例如地形或其他场景几何体。

以下是我当前使用的着色器:
Shader "Custom/StencilWrite"
{
SubShader
{
Tags { "RenderPipeline" = "UniversalPipeline" }
Pass
{
Stencil { Ref 1 WriteMask 255 Comp Always Pass Replace }
ZWrite Off
ColorMask 0
HLSLPROGRAM

pragma vertex vert

pragma fragment frag

include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

struct Attributes { float4 positionOS : POSITION; };
struct Varyings { float4 positionCS : SV_POSITION; };
Varyings vert (Attributes input)
{
Varyings output;
output.positionCS = TransformObjectToHClip(input.positionOS);
return output;
}
half4 frag (Varyings input) : SV_Target
{
return half4(0, 0, 0, 0);
}
ENDHLSL
}
}
}

奇怪的是,当孔洞背后是 Unity Terrain 时,它工作正常。此时,通过透明区域可见地形,正如预期。

然而,如果我移除 Terrain,而仅在孔洞背后放置常规的网格渲染器(岩石、珊瑚、道具、水面等),结果就出错了。孔洞本应显示这些物体,却显示为纯黑色区域,有时是混乱的颜色。

因此,我试图找出为什么模板设置在地形上工作正常,但在常规网格渲染器上却不正常,以及我需要做哪些改动才能使孔洞在普通场景几何体上也同样正常工作。