2016-11-17 14 views
0

基本オブジェクトの重複するフラグメントをすべて削除するためのシェーダを作成しようとしています。私はこの問題の解決策を見つけましたが、これは本当に役に立ちました。Unity Shader:同じステンシル値を持つ2つのレイヤーをオーバーラップする

私にとっては、このリンク(Unity shader highlighting overlaps)が最も有用でした。

しかし、今私は別の問題があります。写真には、通常同じサイズと透明な背景を持つ6つのボタンがあります。これらのボタンの1つが選択されると、それはその隣人と重なります。

次の図は、カスタムシェーダーの外観を示しています。私は、画像を表示するために背景を穴を開けることによって問題を解決しましたが、今はこれらのボタンにテキストを追加したいと思います。もし私が同じことをやり直すならば、そのテキストは不気味に見えるでしょう。

Shader "Custom/GUI/Mask" { 
    Properties 
    { 
     _Color("Color (white = none)", COLOR) = (1,1,1,1) 
     _MainTex("Texture", 2D) = "white" {} 
     _CutOff("Cut off", Range(-0.001,1)) = 0.1 
    } 
    SubShader 
    { 
     Tags{ "RenderType" = "Transparent" "Queue" = "Geometry" } 
     LOD 100 

     Blend SrcAlpha OneMinusSrcAlpha 
     ZWrite off 

     Pass 
     { 
      Stencil 
      { 
       Ref 0 
       Comp Equal 
       Pass IncrSat 
       Fail IncrSat 
      } 

      CGPROGRAM 
       #pragma vertex vert 
       #pragma fragment frag 

       #include "UnityCG.cginc" 

       uniform sampler2D _MainTex; 
       uniform float4 _MainTex_ST; 
       float4 _Color; 
       float _CutOff; 

       struct appdata 
       { 
        float4 vertex : POSITION; 
        float2 uv : TEXCOORD0; 
       }; 

       struct v2f 
       { 
        float4 vertex : SV_POSITION; 
        float2 uv : TEXCOORD0; 
       }; 

       v2f vert(appdata v) 
       { 
        v2f o; 
        o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); 
        o.uv = TRANSFORM_TEX(v.uv, _MainTex); 
        return o; 
       } 

       fixed4 frag(v2f i) : SV_Target 
       { 
        float4 color = tex2D(_MainTex, i.uv); 

        color.rgb *= _Color.rgb; 
        color.a *= _Color.a; 

        if (color.a <= _CutOff) 
        { 
         discard; 
        } 
        return color; 
       } 
      ENDCG 
     } 

     Pass 
     { 
      Blend SrcAlpha OneMinusSrcAlpha 
      ZWrite off 

      Stencil 
      { 
       Ref 1 
       Comp Less 
      } 

      CGPROGRAM 
       #pragma vertex vert 
       #pragma fragment frag 

       #include "UnityCG.cginc" 

       float4 _Color; 
       uniform sampler2D _MainTex; 

       struct appdata 
       { 
        float4 vertex : POSITION; 
        float uv : TEXCOORD0; 
       }; 

       struct v2f 
       { 
        float4 vertex : SV_POSITION; 
        float uv : TEXCOORD0; 
       }; 

       v2f vert(appdata v) 
       { 
        v2f o; 
        o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); 
        o.uv = v.uv; 
        return o; 
       } 

       fixed4 frag(v2f i) : SV_Target 
       { 
        fixed4 color = tex2D(_MainTex, i.uv); 
        color.a = 0; 
        return color; 
       } 
      ENDCG 
     } 

     Pass 
     { 
      Blend SrcAlpha OneMinusSrcAlpha 

      Stencil 
      { 
       Ref 2 
       Comp Less 
      } 

      CGPROGRAM 
       #pragma vertex vert 
       #pragma fragment frag 

       #include "UnityCG.cginc" 

       uniform sampler2D _MainTex; 
       float4 _Color; 

       struct appdata 
       { 
        float4 vertex : POSITION; 
        float uv : TEXCOORD0; 
       }; 

       struct v2f 
       { 
        float4 vertex : SV_POSITION; 
        float uv : TEXCOORD0; 
       }; 

       v2f vert(appdata v) 
       { 
        v2f o; 
        o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); 
        o.uv = v.uv; 
        return o; 
       } 

       fixed4 frag(v2f i) : SV_Target 
       { 
        fixed4 color = tex2D(_MainTex, i.uv); 
        color.a = 0; 
        return color; 
       } 

      ENDCG 
     } 
    } 
} 

この絵は、それが削除されたカスタムシェーダなしのようにどのように見えるか、を示しています。

Menubutton correct

次のコードは、私が透明箱に穴を切断することにより、私の問題を解決する方法について説明します重複部分。この図では、透明な背景には通常0のステンシル値があり、重なると値は1に変わります。問題は、背景のイメージもステンシル値1を持つことです。 1のステンシル値を持つオブジェクトをすべて削除すると、透明な背景のすべてのイメージが削除されます。ところで、画像と背景には同じシェーダが含まれています。

Current view

あなたは透明ボックスに穴を切断することなく、問題を解決するために私を助けてくださいことはできますか?カットスルーオプションには問題があります。透明なピクセルを持つ丸い画像があると、背景が非常に明るく輝きます。

ありがとうございました。

答えて

0

最後に私は自分自身で問題を解決しました。同じ問題を抱えている人にとっては、ここに解決策があります。 私は2つの異なるシェーダを作成しました。私は背景のために1つを作成し、背景の前に画像のために1つを作成しました。

Shader "Custom/GUI/Background" { 
    Properties 
    { 
     _Color("Color (white = none)", COLOR) = (1,1,1,1) 
     _MainTex("Texture", 2D) = "white" {} 
     _CutOff("Cut off", Range(-0.001,1)) = 0.1 
    } 
    SubShader 
    { 
     Tags{ "RenderType" = "Transparent" "Queue" = "Geometry-100" "LightMode" = "ForwardBase" } 
     LOD 100 

     Blend SrcAlpha OneMinusSrcAlpha 
     ZWrite off 

     Pass 
     { 
      Stencil 
      { 
       Ref 0 
       Comp Equal 
       Pass IncrSat 
       Fail IncrSat 
      } 

      CGPROGRAM 
       #pragma vertex vert 
       #pragma fragment frag 

       #include "UnityCG.cginc" 

       uniform sampler2D _MainTex; 
       uniform float4 _MainTex_ST; 
       float4 _Color; 
       float _CutOff; 

       struct appdata 
       { 
        float4 vertex : POSITION; 
        float2 uv : TEXCOORD0; 
       }; 

       struct v2f 
       { 
        float4 vertex : SV_POSITION; 
        float2 uv : TEXCOORD0; 
       }; 

       v2f vert(appdata v) 
       { 
        v2f o; 
        o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); 
        o.uv = TRANSFORM_TEX(v.uv, _MainTex); 
        return o; 
       } 

       fixed4 frag(v2f i) : SV_Target 
       { 
        float4 color = tex2D(_MainTex, i.uv); 

        color.rgb *= _Color.rgb; 
        color.a *= _Color.a; 

        return color; 
       } 
      ENDCG 
     } 
    } 
} 

そして、画像のためのこの1:

Shader "Custom/GUI/ImageShader" 
    { 
    Properties 
    { 
     _MainTex("Texture", 2D) = "white" {} 
     _Color("Color (white = none)", COLOR) = (1,1,1,1) 
    } 
    SubShader 
    { 
     Tags { "RenderType" = "Transparent" } 
     LOD 100 

      Blend SrcAlpha OneMinusSrcAlpha 
      ZWrite off 

     Pass 
     { 
      Stencil 
      { 
       Ref 0 
       Comp Equal 
       Pass IncrSat 
       Fail IncrSat 
      } 

     } 

     // picture layer 
     Pass 
     { 
      Stencil 
      { 
       Ref 2 
       Comp Equal 
      } 

      CGPROGRAM 
       #pragma vertex vert 
       #pragma fragment frag 
       // make fog work 
       #pragma multi_compile_fog 

       #include "UnityCG.cginc" 

       struct appdata 
       { 
        float4 vertex : POSITION; 
        float2 uv : TEXCOORD0; 
       }; 

       struct v2f 
       { 
        float2 uv : TEXCOORD0; 
        UNITY_FOG_COORDS(1) 
        float4 vertex : SV_POSITION; 
       }; 

       sampler2D _MainTex; 
       float4 _MainTex_ST; 
       float4 _Color; 

       v2f vert(appdata v) 
       { 
        v2f o; 
        o.vertex = UnityObjectToClipPos(v.vertex); 
        o.uv = TRANSFORM_TEX(v.uv, _MainTex); 
        UNITY_TRANSFER_FOG(o, o.vertex); 
        return o; 
       } 

       fixed4 frag(v2f i) : SV_Target 
       { 
        // sample the texture 
        fixed4 col = tex2D(_MainTex, i.uv); 
        col.rgb *= _Color.rgb; 
        col.a *= _Color.a; 
        // apply fog 
        UNITY_APPLY_FOG(i.fogCoord, col); 
        return col; 
       } 
      ENDCG 
     } 
    } 
} 

階層は、次のようになる:背景が下にあり、テキスト及び上記

次のコードは、背景であります画像。

正直言って、なぜそれが働いているのか分かりませんが、これは最高の答えではないことが分かりますが、同じ問題またはほぼ同じ問題を抱えているすべての人々を助けることができると思います。

関連する問題