ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SurfaceOutputStandard(Metallic & Smoothness)
    유니티/게임그래픽 2024. 2. 21. 14:19

    Standard Shader : 유니티 5.0부터 다른 많은 그래픽 툴이나 엔진처럼 최신 쉐이더 시스템인 물리기반 시스템이 도입됐다

     

    물리기반 쉐이더 : 주변 환경에 따른 재질 변화를 물리 법칙에 기반하여

    실시간으로 재질을 구현해주는 사실적인 쉐이더 표현 방식

    (Standard Shader가 대표적인 물리기반 쉐이더이고 o.Albedo, o.Emission 모두 물리기반 쉐이더 요소이다)

     

    그리고 SurfaceOutputStandard 구조체에 이 요소들이 정의되어있다

    즉, SurfaceOutputStandard는 물리기반 쉐이더 요소들을 정의하고 있는 구조체이다

     

    이번글에서는 쉐이더 요소들 중 Metallic과 Smoothness를 사용해보겠다

     

    Shader "Custom/NewSurfaceShader"
    {
        Properties
        {
            _MainTex("Texture", 2D) = "white" {}
        }
        SubShader
        {
            Tags { "RenderType"="Opaque" }
    
            CGPROGRAM
            #pragma surface surf Standard fullforwardshadows
    
            sampler2D _MainTex;
    
            struct Input
            {
                float2 uv_MainTex;
            };
            fixed4 _Color;
    
            void surf (Input IN, inout SurfaceOutputStandard o)
            {
               fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
               o.Albedo = c.rgb;
            }
            ENDCG
        }
        FallBack "Diffuse"
    }

    간단하게 구 모양에다 텍스쳐 하나 입력받고 출력해준다

    이제 여기서 Metallic과 Smoothness를 사용하여 더 현실적인 금속재질을 만들어보겠다

     

    Shader "Custom/NewSurfaceShader"
    {
        Properties
        {
            _MainTex("Texture", 2D) = "white" {}
            _Metallic("Metallic", range(0,1)) = 0
            _Smoothness("Smoothness", range(0,1)) = 0.5
    
        }
        SubShader
        {
            Tags { "RenderType"="Opaque" }
    
            CGPROGRAM
            #pragma surface surf Standard fullforwardshadows
    
            sampler2D _MainTex;
            //변수 정의
            float _Metallic;
            float _Smoothness;
    
            struct Input
            {
                float2 uv_MainTex;
            };
            fixed4 _Color;
    
            void surf (Input IN, inout SurfaceOutputStandard o)
            {
               fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
               o.Albedo = c.rgb;
    
               o.Metallic = _Metallic;
               o.Smoothness = _Smoothness;
            }
            ENDCG
        }
        FallBack "Diffuse"
    }

    range형식의 Metallic과 Smoothness라는 이름의 스위치를 만들어준다

    당연히 range니까 float 형식으로 변수를 정의해주고

     

     o.Metallic = _Metallic;
     o.Smoothness = _Smoothness;

     

    가장 중요한 부분. 출력파트에 각각 맞는 이름으로 쉐이더 요소를 넣어준다

     

    Metallic은 재질이 금속이냐 아니냐를 결정 하는 부분이며, 0이면 비금속, 1이면 금속 재질이 된다

     

    Smoothness는 이 재질이 매끄러운지 거친지를 결정하는 부분이다

    0이면 완벽히 거칠어서 난반사만 일어나고 1이면 완벽히 매끄러워서 정반사만 일어나게 된다

     

    스위치 조절에 따라 훨씬 더 질감퀄리티가 좋은 금속재질이 표현된다

     

    여기서 주의할건 출력을 빛의 영향을 받지 않는 Emisson이 아닌 Albedo로 해야 효과적이라는것이다

    같은 값을 넣어도 이렇게 차이가 나는것을 확인할 수 있다

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

    Lambert & Blinn Phong  (0) 2024.02.21
    NormalMap  (0) 2024.02.21
    Vertex Color Masking  (0) 2024.02.21
    Vertex Color  (1) 2024.02.21
    _Time 변수 스크립트 기본형  (0) 2024.02.20
Designed by Tistory.