Unity Shader突出显示重叠

时间:2016-02-23 09:56:40

标签: opengl unity3d shader

我正在尝试为团结编写着色器,以突出网格的重叠片段。它应该适用于一个重叠自身的对象以及多个对象。

结果应该看起来像附加图像。enter image description here

首先,我尝试使用碰撞检测来完成此操作,但我认为最好的方法是编写着色器。

我对着色器不太熟悉,所以如果有人能帮助我,我将不胜感激。

我认为可以使用像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
        }

    } 
}

ShaderTwo

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
        }
    } 
}

结果看起来像附加图像enter image description here

0 个答案:

没有答案