잉ㅇ잉ㅇ 2024. 2. 24. 16:38

이번엔 Rim 라이트를 알파에 집어넣어 우리가 흔히 알고 있는 홀로그램의 기본형을 만들어보자

 

Shader "Custom/NewSurfaceShader"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        CGPROGRAM
        #pragma surface surf Lambert
        sampler2D _MainTex;

        struct Input
        {
            float2 uv_MainTex;
            float3 viewDir;
        };


        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            o.Albedo = 0;

            //rim
            float rim = dot(o.Normal, IN.viewDir);
            o.Emission = pow(1-rim,3);
           
        }
        ENDCG
    }
    FallBack "Diffuse"
}

Fresnel 기본연산에 반전하여 Emission에 넣고 제곱하여 흰색이 차지하는 분량을 줄였다

 

이제 홀로그램을 만들어보자. 홀로그램이 만들어지는 핵심원리는

Rim 라이트 연산을 알파채널에 넣고 반투명하게 만드는것인데

 

15-2일차 불 이펙트

이번에는 여태까지 배운것들을 이용하여 실감나게 움직이는 불 이펙트를 만들어보겠다 Shader "Custom/NewSurfaceShader" { Properties { _MainTex ("Texture", 2D) = "white" {} _MainTex2 ("Texture2", 2D) = "white" {} } SubShader {

sangeun00.tistory.com

반투명하게 만드는법은 전에 만들었던 불을 만드는 방식을 사용하면 된다

 

Shader "Custom/NewSurfaceShader"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" "Queue" = "Transparent"} // 추가
        CGPROGRAM
        #pragma surface surf Lambert alpha:fade   // 알파를 투명하게
        sampler2D _MainTex;

        struct Input
        {
            float2 uv_MainTex;
            float3 viewDir;
        };


        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            //o.Albedo = 0;   // 주석처리

            //rim
            float rim = dot(o.Normal, IN.viewDir);
            //o.Emission = pow(1-rim,3);   //주석처리
            o.Alpha = pow(1-rim, 3);
        }
        ENDCG
    }
    FallBack "Diffuse"
}

우선 rim의 반대되는 값을 출력할 예정이니 albedo나 Emission같은 출력값들은 전부 주석처리를 해준다

 

여기서 Emission에 원하는 색상을 받고 싶다면 Properties에서 색상을 받아와 넣어주면 된다

Shader "Custom/NewSurfaceShader"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Color("color", Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" "Queue" = "Transparent"}
        CGPROGRAM
        #pragma surface surf Lambert alpha:fade
        sampler2D _MainTex;
        float4 _Color;

        struct Input
        {
            float2 uv_MainTex;
            float3 viewDir;
        };


        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            //o.Albedo = 0;
            o.Emission = _Color.rgb;

            //rim
            float rim = dot(o.Normal, IN.viewDir);
            //o.Emission = pow(1-rim,3);
            o.Alpha = pow(1-rim, 3);
        }
        ENDCG
    }
    FallBack "Diffuse"
}

색상을 받아 출력하는건 이미 많이해와서 어렵지 않다

_Color의 이름으로 입력받을 색상을 하나 만들어주고 Emission으로 _Color의 rgb를 출력해준다

색을 조절할수 있게 되었으니 이번엔 Rim 라이트의 두께를 range로 조절하게 만들어보자

Shader "Custom/NewSurfaceShader"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Color("color", Color) = (1,1,1,1)
        _RimPow("Rimpower", range(1,10)) = 3
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" "Queue" = "Transparent"}
        CGPROGRAM
        #pragma surface surf Lambert alpha:fade

        sampler2D _MainTex;
        float4 _Color;
        float _RimPow;

        struct Input
        {
            float2 uv_MainTex;
            float3 viewDir;
        };


        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            //o.Albedo = 0;
            o.Emission = _Color.rgb;

            //rim
            float rim = saturate(dot(o.Normal, IN.viewDir));
            //o.Emission = pow(1-rim,3);

            o.Alpha = pow(1-rim, _Rimpow);
        }
        ENDCG
    }
    FallBack "Diffuse"
}

이건 정말 간단하다 rim의 반전값을 제곱해줄 수를 3대신 range로 입력받은 숫자를 집어넣기만 하면된다