zoukankan      html  css  js  c++  java
  • 简单模拟大气颜色过度

    // 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"
    }
  • 相关阅读:
    一条痛并快乐的路
    Daily Scrum 11.1
    Daily Scrum 10.31
    Daily Scrum 10.30
    Daily Scrum 10.29
    Daily Scrum 10.28
    Daily Scrum 10.27
    (Alpha)Let's-Chronos分数分配规则
    Daily Scrum 10.26
    Daily Scrum 10.25
  • 原文地址:https://www.cnblogs.com/sifenkesi/p/11315959.html
Copyright © 2011-2022 走看看