ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 홀로그램
    유니티/게임그래픽 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로 입력받은 숫자를 집어넣기만 하면된다

     

     

     

    '유니티 > 게임그래픽' 카테고리의 다른 글

    홀로그램 응용  (0) 2024.02.24
    Fresnel(프레넬) & Rim 라이트  (0) 2024.02.22
    Half-Lambert  (0) 2024.02.22
    Vertex Color 응용  (0) 2024.02.22
    Lambert 커스텀 라이트  (0) 2024.02.21
Designed by Tistory.