QQ聊天

Unity的Shader如何控制投影颜色

细节慢慢补充,有几个需要注意的地方,必须要有接收投影的pass也就是Name是ShadowCollector的,必须添加#pragma multi_compile_fwdbase,物体的着色器必须有Tag 里面的 {"LightMode" = "ForwardBase"}。处理投影要在接收投影的物体shader里。

随后是三个宏。

SHADOW_COORDS这个宏后面的参数是指第几个通道,不要和其他的出现冲突,也就是要改变投影的颜色话必须要占用一个通道。

在顶点处理器里调用TRANSFER_SHADOW。

然后像素着色器调用SHADOW_ATTENUATION,返回的就是这个像素是否存在阴影中。

可改变投影颜色的范例如下。

Shader "Example/ShadowColor" 
{
    Properties 
    {
        _MainColor("MainColor",color) = (0.5,0.5,0.5,1)
        _ShadowColor("ShadowColor",color) = (1,1,0,1)
    }
    SubShader 
    {
        Tags {"RenderType"="Opaque"}
        Pass 
        {
                Tags {"LightMode" = "ForwardBase"}
                
            CGPROGRAM
            #pragma multi_compile_fwdbase
            #include "UnityCG.cginc"
            #include "Lighting.cginc"
            #include "AutoLight.cginc"
            
            #pragma vertex vertexMain
            #pragma fragment fragmentMain
            
            fixed4 _MainColor;
            fixed4 _ShadowColor;

            struct VertexToFragment 
            {
                float4 pos         : SV_POSITION;
                half4 uv          : TEXCOORD0;
                SHADOW_COORDS(1)
            };
            
            VertexToFragment vertexMain (appdata_full v) 
            {
                VertexToFragment result = (VertexToFragment)0;
                result.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                result.uv.xy =  v.texcoord.xy;
                TRANSFER_SHADOW(result)
                return result;
            }
            
            fixed4 fragmentMain (VertexToFragment i) : COLOR0 
            {
                float attenuation = SHADOW_ATTENUATION(i);
                return lerp(_MainColor*_ShadowColor,_MainColor,attenuation);
            }

            ENDCG
        }
        
        Pass
        {
            Name "ShadowCollector"
            Tags { "LightMode" = "ShadowCollector" }
            
            Fog {Mode Off}
            ZWrite On ZTest LEqual

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_shadowcollector

            #define SHADOW_COLLECTOR_PASS
            #include "UnityCG.cginc"

            struct appdata { float4 vertex : POSITION;};
            struct v2f { V2F_SHADOW_COLLECTOR;};

            v2f vert (appdata v)
            {
                v2f o;
                TRANSFER_SHADOW_COLLECTOR(o)
                return o;
            }

            fixed4 frag (v2f i) : SV_Target { SHADOW_COLLECTOR_FRAGMENT(i)}
            ENDCG
        }
   
    } 

}

 

posted @ 2015-08-03 14:59  SITT  阅读(6577)  评论(0编辑  收藏  举报
QQ聊天