【发布时间】:2016-06-05 02:16:06
【问题描述】:
我正在尝试为统一编写一个着色器,以突出显示网格的重叠片段。它应该适用于重叠自身的一个对象以及多个对象。
首先我尝试通过碰撞检测来实现这一点,但我认为最好的方法是编写着色器。
我对着色器不是很熟悉,所以如果有人能帮助我,我将不胜感激。
我认为这可以通过使用模板着色器来完成,例如http://docs.unity3d.com/Manual/SL-Stencil.html 但是这个着色器只渲染两个对象的交集而不渲染整个对象。
我还发现了基于深度 (https://chrismflynn.wordpress.com/2012/09/06/fun-with-shaders-and-the-depth-buffer/) 的着色器,但这也适用于两个对象,并且不适用于一个自身重叠的网格
关于@Zze 对两个Pass 的想法的评论,我现在有两个着色器。当一个有一个着色器而另一个有第二个着色器时,它适用于两个对象。
也许任何人都可以帮助我如何将它组合成一个着色器,该着色器也适用于自身重叠的对象?
ShaderOne
Shader "Custom/ShaderOne"
{
SubShader {
Tags { "RenderType"="Opaque" "Queue"="Geometry"}
Pass {
Stencil {
Ref 2
Comp always
Pass keep
Fail decrWrap
ZFail keep
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct appdata {
float4 vertex : POSITION;
};
struct v2f {
float4 pos : SV_POSITION;
};
v2f vert(appdata v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
return o;
}
half4 frag(v2f i) : SV_Target {
return half4(0,1,0,1);
}
ENDCG
}
Pass {
Stencil {
Ref 2
Comp equal
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct appdata {
float4 vertex : POSITION;
};
struct v2f {
float4 pos : SV_POSITION;
};
v2f vert(appdata v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
return o;
}
half4 frag(v2f i) : SV_Target {
return half4(0,0,1,1);
}
ENDCG
}
}
}
着色器二
Shader "Custom/ShaderTwo"
{
SubShader {
Tags { "RenderType"="Opaque" "Queue"="Geometry"}
Pass {
Stencil {
Ref 2
Comp always
Pass replace
ZFail keep
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct appdata {
float4 vertex : POSITION;
};
struct v2f {
float4 pos : SV_POSITION;
};
v2f vert(appdata v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
return o;
}
half4 frag(v2f i) : SV_Target {
return half4(1,0,0,1);
}
ENDCG
}
}
}
【问题讨论】:
-
如果模板着色器渲染交点,那你为什么不做一个着色器有2遍,第一个正常绘制,然后第二个模仿模板着色器的结果?
-
@mrVoid 我认为深度测试只能在相机顶视图的情况下工作 - 但是当它是透视时,这不起作用?我为此头疼。也许你可以给我一些使用示例代码的例子?
-
好的@seek。看来我误解了你的目标。所以它不是一个 2D 自上而下的视图,它是一个 3D 模型视图,其中绘制了某种透明层是吗?我问你将拥有多少几何图形。如果不实现一些代码来精确计算几何布尔运算,这可能是不可行的。