Shader "HSH/UpgradeColorEffect"
{
    Properties
    {
        _MainTex("MainTex", 2D) = "white" {}
        _MaskTex("Mask", 2D) = "white" {}
        _NoiseTex("Noise Texture", 2D) = "white" {}
        _LightColor("Light Color", Color) = (1, 1, 1, 1)
        _LightIntensity("Light Intensity", Range(0, 5)) = 1.0
        _NoiseScale("Noise Scale", Range(0, 5)) = 1.0
        _NoiseSpeed("Noise Speed", Range(0, 5)) = 1.0

        [HideInInspector] _Color("Tint", Color) = (1,1,1,1)
        [HideInInspector] _RendererColor("RendererColor", Color) = (1,1,1,1)
    }

    SubShader
    {
        Tags {"Queue" = "Transparent" "RenderType" = "Transparent" "RenderPipeline" = "UniversalPipeline" }
        LOD 100

        Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha
        Cull Off
        ZWrite Off

        Pass
        {
            Tags { "LightMode" = "Universal2D" }

            HLSLPROGRAM
            
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"            

            #pragma vertex vert
            #pragma fragment frag

            #pragma multi_compile USE_SHAPE_LIGHT_TYPE_0 __
            #pragma multi_compile USE_SHAPE_LIGHT_TYPE_1 __
            #pragma multi_compile USE_SHAPE_LIGHT_TYPE_2 __
            #pragma multi_compile USE_SHAPE_LIGHT_TYPE_3 __
            #pragma multi_compile _ DEBUG_DISPLAY

            struct Attributes
            {
                float4 positionOS   : POSITION;  
                float4 color        : COLOR;
                float2 uv           : TEXCOORD0;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct Varyings
            {
                float4 positionHCS  : SV_POSITION;
                float4 color        : COLOR;
                float2 uv           : TEXCOORD0;
                half2  lightingUV   : TEXCOORD2; 
                float4 screenPos    : TEXCOORD1;
                #if defined(DEBUG_DISPLAY)
                float3  positionWS  : TEXCOORD2;
                #endif
                UNITY_VERTEX_OUTPUT_STEREO
            };

            #include "Packages/com.unity.render-pipelines.universal/Shaders/2D/Include/LightingUtility.hlsl"

            TEXTURE2D(_MainTex);
            TEXTURE2D(_NoiseTex);
            TEXTURE2D(_MaskTex);
            SAMPLER(sampler_MainTex);
            SAMPLER(sampler_NoiseTex);
            SAMPLER(sampler_MaskTex);

            float4 _LightColor;
            float _LightIntensity;
            float _NoiseScale;
            float _NoiseSpeed;
            float4 _Color;
            half4 _RendererColor;
            
            #if USE_SHAPE_LIGHT_TYPE_0
            SHAPE_LIGHT(0)
            #endif

            #if USE_SHAPE_LIGHT_TYPE_1
            SHAPE_LIGHT(1)
            #endif

            #if USE_SHAPE_LIGHT_TYPE_2
            SHAPE_LIGHT(2)
            #endif

            #if USE_SHAPE_LIGHT_TYPE_3
            SHAPE_LIGHT(3)
            #endif

            CBUFFER_START(UnityPerMaterial)
                float4 _MainTex_ST;   
            CBUFFER_END

            Varyings vert(Attributes IN)
            {
                Varyings OUT;

                UNITY_SETUP_INSTANCE_ID(IN);
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);

                OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
                OUT.uv = TRANSFORM_TEX(IN.uv, _MainTex);
                OUT.screenPos = ComputeScreenPos(OUT.positionHCS);
                OUT.color = IN.color;
                OUT.lightingUV = half2(ComputeScreenPos(OUT.positionHCS / OUT.positionHCS.w).xy);\

                OUT.color = IN.color * _Color * _RendererColor;

                return OUT;
            }

            #include "Packages/com.unity.render-pipelines.universal/Shaders/2D/Include/CombinedShapeLightShared.hlsl"

            half4 frag(Varyings IN) : SV_Target
            {
                half4 textureColor = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, IN.uv) * IN.color;
                half4 mask = SAMPLE_TEXTURE2D(_MaskTex, sampler_MaskTex, IN.uv);
                
                half noiseValue = SAMPLE_TEXTURE2D(_NoiseTex, sampler_NoiseTex, IN.uv * (_NoiseScale * 0.4) + _Time.y * (_NoiseSpeed * 0.01)).r;
                half4 lightEffect = _LightColor * noiseValue * _LightIntensity;
                
                SurfaceData2D surfaceData;
                InputData2D inputData;
                InitializeSurfaceData(textureColor.rgb, textureColor.a, mask, surfaceData);
                InitializeInputData(IN.uv, IN.lightingUV, inputData);
                    
                half4 lightResult = CombinedShapeLightShared(surfaceData, inputData);                
                return lerp(lightResult, lightResult + lightEffect, saturate(lightResult.a));
            }
            ENDHLSL
        }
    }
}

+ Recent posts