2016-11-17 1 views
0

기본 오브젝트의 모든 겹치는 부분을 제거하는 단일화 쉐이더를 작성하려고합니다. 나는이 문제에 대한 다른 해결책을 발견했는데, 이것은 실제로 도움이되었다.Unity Shader : 동일한 스텐실 값을 가진 두 개의 레이어 겹침

나를 위해이 링크 (Unity shader highlighting overlaps)가 가장 유용했습니다.

하지만 이제는 또 다른 문제가 있습니다. 사진에는 ​​보통 크기가 같고 투명한 배경을 가진 6 개의 버튼이 있습니다. 이 단추들 중 하나가 선택되면 이웃 단추가 겹칩니다.

다음 그림은 사용자 정의 셰이더의 모양을 보여줍니다. 배경을 채우기 위해 구멍을 뚫어 문제를 해결했지만 지금은이 버튼에 텍스트를 추가하고 싶습니다. 만약 내가 똑같은 일을 다시한다면, 텍스트는 엉망이 될 것입니다.

Menubutton correct

다음 코드는 내가 투명 상자에 구멍을 절단하여 내 문제를 해결하는 방법을 보여줍니다 :

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

이 그림은 그것을 제거하는 사용자 정의 쉐이더없이 어떻게 보이는지 보여줍니다 겹치는 부분들. 이 그림에서 투명한 배경은 일반적으로 스텐실 값이 0이고 겹치면 값이 1로 변경됩니다. 문제는 배경 이미지의 스텐실 값도 1입니다. 따라서 if 스텐실 값이 1 인 모든 객체를 제거하면 투명 배경에있는 모든 이미지가 제거됩니다. 그런데 이미지와 배경에는 같은 쉐이더가 있습니다.

Current view

당신은 투명 상자에 구멍을 절단하지 않고 내가 문제를 해결하는 데 도움이시겠습니까? 절삭 옵션에는 문제가 있습니다. 투명 픽셀이있는 둥근 이미지가 있으면 배경이 매우 밝게 빛납니다.

도움 주셔서 감사합니다.

답변

0

마지막으로 문제를 직접 해결했습니다. 동일한 문제가있는 사람들을 위해, 여기 해결책입니다. 두 개의 다른 쉐이더를 만들었습니다. 나는 배경을 위해 하나를 만들었고 배경 앞에 그림을 만들었다.

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

그리고 영상이 하나 :

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

계층 지금 : 배경이 맨 아래에 다음 텍스트와 위

다음 코드는 배경이다 영상.

솔직하게 말해서, 왜 작동하고 있는지 모르겠지만 이것이 최선의 대답은 아니라는 것을 알고 있습니다. 그러나 나는 똑같은 또는 거의 같은 문제를 겪고있는 모든 사람들을 도울 수 있기를 바랍니다.

관련 문제