简单模拟大气颜色过度

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Earth"
{
    Properties 
    {
        _AtmosphereColor ("Atmosphere Color", Color) = (0.1, 0.35, 1.0, 1.0)
        _AtmospherePow ("Atmosphere Power", Range(1.5, 8)) = 2
        _AtmosphereMultiply ("Atmosphere Multiply", Range(1, 3)) = 1.5

        _DiffuseTex("Diffuse", 2D) = "white" {}
        
        _CloudAndNightTex("Cloud And Night", 2D) = "black" {}

        //_LightDir("Light Dir", Vector) = (-1,0,0,1)
    }

    SubShader 
    {
        ZWrite On
        ZTest LEqual

        pass
        {
        CGPROGRAM
            #include "UnityCG.cginc"
            #pragma vertex vert 
            #pragma fragment frag
            
            sampler2D _DiffuseTex;
            sampler2D _CloudAndNightTex;

            float4 _AtmosphereColor;
            float _AtmospherePow;
            float _AtmosphereMultiply;

            //float4 _LightDir;

            struct vertexInput 
            {
                float4 pos                : POSITION;
                float3 normal            : NORMAL;
                float2 uv                : TEXCOORD0;
            };

            struct vertexOutput 
            {
                float4 pos            : POSITION;
                float2 uv            : TEXCOORD0;
                half diffuse        : TEXCOORD1;
                half night            : TEXCOORD2;
                half3 atmosphere    : TEXCOORD3;
            };
            
            vertexOutput vert(vertexInput input) 
            {
                vertexOutput output;
                output.pos = UnityObjectToClipPos(input.pos);
                output.uv = input.uv;

                float3 localLightDir = normalize(ObjSpaceLightDir(input.pos));
                output.diffuse = saturate(dot(localLightDir, input.normal) * 1.2);
                output.night = 1 - saturate(output.diffuse * 2);

                half3 viewDir = normalize(ObjSpaceViewDir(input.pos));
                half3 normalDir = input.normal;
                output.atmosphere = output.diffuse * _AtmosphereColor.rgb * pow(1 - saturate(dot(viewDir, normalDir)), _AtmospherePow) * _AtmosphereMultiply;

                return output;
            }

            half4 frag(vertexOutput input) : Color
            {
                half3 colorSample = tex2D(_DiffuseTex, input.uv).rgb;

                half3 cloudAndNightSample = tex2D(_CloudAndNightTex, input.uv).rgb;
                half3 nightSample = cloudAndNightSample.ggb;
                half cloudSample = cloudAndNightSample.r;

                half4 result;
                result.rgb = (colorSample + cloudSample) * input.diffuse + nightSample * input.night + input.atmosphere;

                result.a = 1;
                return result;
            }
        ENDCG
        }
    }
    
    Fallback "Diffuse"
}

猜你喜欢

转载自www.cnblogs.com/sifenkesi/p/11315959.html