0503 쉐이더를 이용해서 불 이펙트 만들기

2021. 5. 3. 17:32unity/쉐이더

Shader "Custom/Test"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Transparent" "Queue"="Transparent"}
        LOD 200

        CGPROGRAM
       
        #pragma surface surf Standard alpha:fade

        sampler2D _MainTex;

        struct Input
        {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutputStandard o)
        {

            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            o.Emission = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

텍스쳐를 사용하기 전 알파 채널이 있는지 확인

alpha:fade를 사용하면 블랙(0) 부분만 투명화가 된다.

 

 

Shader "Custom/Test"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _MainTex2("Albedo (RGB)", 2D) = "white" {}
        _Speed ("Speed",Range(0,2))=0

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

        CGPROGRAM
       
        #pragma surface surf Standard alpha:fade

        sampler2D _MainTex;
        sampler2D _MainTex2;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_MainTex2;
        };

        float _Speed;

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            fixed4 d = tex2D(_MainTex2, float2(IN.uv_MainTex2.x,IN.uv_MainTex2.y+1-_Time.y*_Speed));
            o.Emission = c.rgb * d.rgb;
            
            o.Alpha = c.a * d.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

두 텍스쳐와 rgb, alpha를 곱하면 두 개가 겹쳐서 출력된다.
두 개의 텍스쳐를 겹쳐 둘 다 알파값을 fade 시켰다.

 


 

void surf (Input IN, inout SurfaceOutputStandard o)
        {
            float4 d = tex2D(_MainTex2, float2(IN.uv_MainTex2.x, IN.uv_MainTex2.y-_Time.y)); //클라우드 텍스쳐 source로 사용됨
            float4 c = tex2D(_MainTex, IN.uv_MainTex + d.r); //첫번째 텍스쳐, 불꽃
            o.Emission = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG

두 번째 텍스쳐를 데이터로써 사용한 경우.

두 번째를 데이터로서 사용했기에 시간에 따라 흘러가는 코드도 두 번째 텍스쳐에 반영시켰다.

훨씬 자연스러운 불꽃이 되었다.

 

Shader "Custom/NewSurfaceShader"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _MainTex2("Albedo (RGB)", 2D) = "white" {}
        _Speed("Speed",Range(0,1)) = 0
        _BD("Brightness", Range(0, 2)) = 0
        
    }
    SubShader
    {
        Tags { "RenderType"="Transparent" "Queue"="Transparent" }

        CGPROGRAM
        
        #pragma surface surf Standard alpha:fade


        sampler2D _MainTex;
        sampler2D _MainTex2;
        

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_MainTex2;
            
        };

        float _Speed;
        float _BD;

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            
            fixed4 d = tex2D(_MainTex2, IN.uv_MainTex2);
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex + (d.r*_BD) );
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

아래 클라우드 텍스쳐의 밝기를 조절하면 (rgb의 밝기) 찌그러짐의 정도를 조절할 수 있다.