Unity3D/Shader

Shader) 2D URP 굴절 셰이더

HSH12345 2023. 10. 5. 15:12
Shader "Water/2DRefraction"
{
    Properties
    {
        _MainTex("Main Texture", 2D) = "white" {}
        _DistortionTex("Distortion Texture", 2D) = "white" {}
        _Speed("Speed", float) = 1
        _Scale("Scale", float) = 0.001
        _Alpha("Alpha", float) = 1
        _WaveHeight("Wave Height", float) = 0.05
        _WaveFrequency("Wave Frequency", float) = 2.0
        _WaveSpeed("Wave Speed", float) = 1.0
    }

    SubShader
    {
        Tags { "RenderType" = "Transparent" "RenderPipeline" = "UniversalRenderPipeline" }
        LOD 100

        Blend SrcAlpha OneMinusSrcAlpha
        ZWrite Off
        Cull Off

        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag

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

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

            struct Varyings
            {
                float4 positionHCS  : SV_POSITION;
                float2 uv           : TEXCOORD0;
                float2 screenUV     : TEXCOORD1;
            };

            TEXTURE2D(_MainTex);
            TEXTURE2D(_DistortionTex);
            TEXTURE2D(_CameraSortingLayerTexture);
            SAMPLER(sampler_MainTex);
            SAMPLER(sampler_DistortionTex);
            SAMPLER(sampler_CameraSortingLayerTexture);

            CBUFFER_START(UnityPerMaterial)
                float4 _MainTex_ST;
                float4 _DistortionTex_ST;
                float _Speed;
                float _Scale;
                float _Alpha;
                float _WaveHeight;   
                float _WaveFrequency;
                float _WaveSpeed;    
            CBUFFER_END

            Varyings vert(Attributes IN)
            {
                Varyings OUT;
                OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
                OUT.uv = IN.uv;
                
                float4 clipPosition = OUT.positionHCS;
                float2 screenUV = (clipPosition.xy / clipPosition.w) * 0.5 + 0.5;
                screenUV.y = 1.0 - screenUV.y;

                OUT.screenUV = screenUV; 

                return OUT;
            }
            
            half4 frag(Varyings IN) : SV_Target
            {
                float wave = _WaveHeight * sin(_WaveFrequency * IN.uv.x + _WaveSpeed * _Time.y);
                float2 wavyUV = float2(IN.uv.x, IN.uv.y + wave);

                float2 distortion = (_Speed * SAMPLE_TEXTURE2D(_DistortionTex, sampler_DistortionTex, wavyUV + _Time.y).rg - 0.5) * _Scale;
                float2 distortedUV = IN.screenUV + distortion;

                half4 sceneColor = SAMPLE_TEXTURE2D(_CameraSortingLayerTexture, sampler_CameraSortingLayerTexture, distortedUV);

                return sceneColor;
            }

            ENDHLSL
        }
    }
}

 

-Renderer 2D Data설정