unity3d - Unity 3D HDRP - 通过着色器使用模板在游戏对象中打孔
问题描述
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,我开始四处玩耍,看看是否有任何地方。孔着色器应该有ColorMask RGB 0,但是除了孔对象变得不可见之外什么都没有发生。这让我相信我无法正确使用模板缓冲区。我到了可以标记要擦除的像素的地步,但是我无法擦除它们。我希望能够擦除主要对象(奶酪)的这一部分,以便背景(在这种情况下为地板)可见。
有没有办法在 HDRP 中做到这一点?
注意:我还在我的 HDRP 项目中尝试了通过脚本和着色器的渲染队列方法,但没有成功,尽管相同的代码适用于标准的统一项目。
解决方案
推荐阅读
- html - 禁用基于按钮的分页
- python - 使用额外的索引键展平 DataFrame 嵌套列表/数组(用于时间序列)
- performance - 性能方面,我们应该支持嵌套文档还是加入多个集合
- typescript - 尝试在 Linux Mint 中使用 npm 升级 Typescript
- java - 这是 Hash Map 的有效单元测试吗?
- c - 使用 C 中的 Polar 方法向帧添加噪声
- filter - 尝试在 Power BI 中返回筛选日期列的最大值
- javascript - 如何对 2d for 循环进行排序并将结果输入斜边公式
- c# - 彩色按钮阴影
- java - Eclipse 启动的 Maven 项目不使用 \target 文件夹中的类