Страница 1 из 1

silhouette shader + projector

СообщениеДобавлено: 25 янв 2019, 20:06
bilol@leeching.net
Есть террейн, на нем могут стоять здания. Я выделяю на террейне площадь, которая должна идти по высоте террейна и просвечивать сквозь здания. Как можно сделать данный эффект?
Просто выделить область можно при помощи projector, но он не будет просвечивать сквозь здания.
Вот шейдер юнити для projector, в него можно добавить ZTest Greater и тогда он будет просвечивать но тогда он не будет учитывать высоту террейна.
Синтаксис:
Используется glsl
Shader "Projector/Light" {
        Properties {
                _Color ("Main Color", Color) = (1,1,1,1)
                _ShadowTex ("Cookie", 2D) = "" {}
                _FalloffTex ("FallOff", 2D) = "" {}
        }
       
        Subshader {
                Tags {"Queue"="Transparent"}
                Pass {
                        ZWrite Off
                        ColorMask RGB
                        Blend DstColor One
                        Offset -1, -1
       
                        CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag
                        #pragma multi_compile_fog
                        #include "UnityCG.cginc"
                       
                        struct v2f {
                                float4 uvShadow : TEXCOORD0;
                                float4 uvFalloff : TEXCOORD1;
                                UNITY_FOG_COORDS(2)
                                float4 pos : SV_POSITION;
                        };
                       
                        float4x4 unity_Projector;
                        float4x4 unity_ProjectorClip;
                       
                        v2f vert (float4 vertex : POSITION)
                        {
                                v2f o;
                                o.pos = UnityObjectToClipPos (vertex);
                                o.uvShadow = mul (unity_Projector, vertex);
                                o.uvFalloff = mul (unity_ProjectorClip, vertex);
                                UNITY_TRANSFER_FOG(o,o.pos);
                                return o;
                        }
                       
                        fixed4 _Color;
                        sampler2D _ShadowTex;
                        sampler2D _FalloffTex;
                       
                        fixed4 frag (v2f i) : SV_Target
                        {
                                fixed4 texS = tex2Dproj (_ShadowTex, UNITY_PROJ_COORD(i.uvShadow));
                                texS.rgb *= _Color.rgb;
                                texS.a = 1.0-texS.a;
       
                                fixed4 texF = tex2Dproj (_FalloffTex, UNITY_PROJ_COORD(i.uvFalloff));
                                fixed4 res = texS * texF.a;

                                UNITY_APPLY_FOG_COLOR(i.fogCoord, res, fixed4(0,0,0,0));
                                return res;
                        }
                        ENDCG
                }
        }
}
 

На картинке выделенная площадь это красно зеленая область.
Изображение