[학원 Unity]/[게임 그래픽 프로그래밍]

09-03 수업내용 ) UV 이미지 이용해보기

롤링페이퍼 2024. 9. 3. 10:29

uv 애니메이션

 

Shader "Custom/Tex2"
{
    Properties
    {
        _MainTexture ("Main Texture 2D", 2D) = "white" {}
        _UVOffsetX ("UV Offset X", Range(-1, 1)) = 0
        _UVOffsetY ("UV Offset Y", Range(-1, 1)) = 0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        CGPROGRAM
        #pragma surface surf Standard
        #pragma target 3.0

        sampler2D _MainTexture;
        float _UVOffsetX;
        float _UVOffsetY;

        struct Input
        {
            float2 uv_MainTexture;
        };

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            float2 uv = IN.uv_MainTexture;

            float dir = -1;
            float speed = 1.2;

            float4 color = tex2D(_MainTexture, float2(uv.x +  (dir * speed * _Time.y), uv.y));

            o.Emission = color.rgb;
            o.Alpha = color.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

태그와 옵션을 사용해서 텍스쳐의 반투명하게 만들기

 

Shader "Custom/Fire"
{
    Properties
    {
        _FireTex ("Fire Texture 2D", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        CGPROGRAM
        #pragma surface surf Standard
        #pragma target 3.0

        sampler2D _FireTex;

        struct Input
        {
            float2 uv_FireTex;
        };

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            float4 color = tex2D(_FireTex, IN.uv_FireTex);
            o.Emission = color.rgb;
            o.Alpha = color.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

 

Shader "Custom/Fire"
{
    Properties
    {
        _FireTex ("Fire Texture 2D", 2D) = "white" {}
        _NoiseTex ("Noise Texture 2D", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Transparent" "Queue" = "Transparent"}

        CGPROGRAM        
        #pragma surface surf Standard alpha:fade
        #pragma target 3.0

        sampler2D _FireTex;
        sampler2D _NoiseTex;

        struct Input
        {
            float2 uv_FireTex;
            float2 uv_NoiseTex;
        };

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            float4 fireColore = tex2D(_FireTex, IN.uv_FireTex);

            float2 uvNoise = IN.uv_NoiseTex;
            float4 noiseColor = tex2D(_NoiseTex, float2(uvNoise.x, uvNoise.y - _Time.y));


            o.Emission = fireColore.rgb * noiseColor.rgb;
            o.Alpha = fireColore.a * noiseColor.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

3. 이미지를 흐르게 구겨지게 만들어보자

Shader "Custom/Fire"
{
    Properties
    {
        _FireTex ("Fire Texture 2D", 2D) = "white" {}
        _NoiseTex ("Noise Texture 2D", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Transparent" "Queue" = "Transparent"}

        CGPROGRAM        
        #pragma surface surf Standard alpha:fade
        #pragma target 3.0

        sampler2D _FireTex;
        sampler2D _NoiseTex;

        struct Input
        {
            float2 uv_FireTex;
            float2 uv_NoiseTex;
        };

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            float4 noiseColor = tex2D(_NoiseTex, float2(IN.uv_NoiseTex.x, IN.uv_NoiseTex.y - _Time.y));

            float4 fireColore = tex2D(_FireTex, IN.uv_FireTex + noiseColor.r);

            o.Emission = fireColore.rgb;
            o.Alpha = fireColore.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

4. 구겨지는 강도를 조절해보기 (수정 필요)

Shader "Custom/Fire"
{
    // 인터페이스
    Properties
    {
        _FireTex ("Fire Texture 2D", 2D) = "white" {}   // 첫번째 이미지
        _NoiseTex ("Noise Texture 2D", 2D) = "white" {} // 두번째 이미지
        _NosieStrength("Nosie Strength", Range(0,1)) = 1    // 구겨지는 이미지 값 조절

    }
    SubShader
    {
        Tags { "RenderType"="Transparent" "Queue" = "Transparent"}

        CGPROGRAM        
        #pragma surface surf Standard alpha:fade
        #pragma target 3.0

        // 매개 변수
        sampler2D _FireTex;
        sampler2D _NoiseTex;
        float _NosieStrength;

        struct Input
        {
            // 변수 선언
            float2 uv_FireTex;
            float2 uv_NoiseTex;
            float2 _NosieStrength;
        };

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            // 데이터
            // 해당 이미지에 애니메이션 : float2(IN.해당이미지.x, IN.해당이미지.y - _Time.y)
            float2 uvNoiseTex = IN.uv_NoiseTex;
            float4 noiseColor = tex2D(_NoiseTex, float2(uvNoiseTex.x, uvNoiseTex.y - _Time.y));

            // 데이터를 적용할 텍스쳐
            float4 fireColore = tex2D(_FireTex, IN.uv_FireTex + noiseColor.r * _NosieStrength);


            o.Emission = fireColore.rgb;
            o.Alpha = fireColore.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}