Проект Unity 2019.1.2f1 HDRP.
Я пытаюсь сделать дыру в готовом игровом объекте, в котором есть материал и шейдер, который не хочет мешать, точкаЭто должно работать с любым объектом, на котором это сделано.Я нашел этот подход где-то еще, но он не работает для версии HD Render Pipeline.В основном, два дополнительных игровых объекта / формы помещаются туда, где должно быть сделано отверстие, один объект имеет подготовительный проход, а другой делает отверстие.
Пример шейдера:
Shader "Custom/HolePrepare" {
Properties{
}
SubShader{
Tags { "RenderType" = "Opaque" "Queue" = "Geometry+1"}
ColorMask 0
ZWrite off
Stencil {
Ref 1
Comp always
Pass replace
}
CGINCLUDE
struct appdata {
float4 vertex : POSITION;
};
struct v2f {
float4 pos : SV_POSITION;
};
v2f vert(appdata v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
return o;
}
half4 frag(v2f i) : SV_Target {
return half4(1,1,0,1);
}
ENDCG
Pass {
Cull Front
ZTest Less
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
ENDCG
}
Pass {
Cull Back
ZTest Greater
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
ENDCG
}
}
}
и
Shader "Custom/Hole" {
Properties{
}
SubShader{
Tags{ "Queue" = "Geometry+10" }
ColorMask RGB
ZWrite On
Stencil {
Ref 1
Comp notequal
Pass Zero
}
Pass{}
}
}
Я полагаю, что эти значения не являются теоретически правильными, потому что это не тот пример кода, но так как он не работал для HDRP, я начал играть и посмотреть, получил ли яв любом месте.Шейдер Hole должен иметь ColorMask RGB 0 , однако ничего не происходит, кроме того, что объект отверстия становится невидимым.Это заставило меня поверить, что я не могу использовать трафаретный буфер должным образом.Я дошел до того, что смог пометить пиксели, которые хотел стереть, однако я не могу их стереть.Я хочу иметь возможность стереть эту часть первичного объекта (сыр), чтобы фон (в данном случае пол) был виден.
Есть ли способ сделать это в HDRP?
Примечание: Я также пробовал очередь рендерингаПодход сценарием и шейдером в моем проекте HDRP, но безуспешно, хотя тот же самый код работал в стандартном проекте Unity.