본문으로 바로가기
반응형


첨부한 Shader는 Unity 2017.3 이상 버젼에서만 작동합니다.





Resource는 Perfect Knight를 제작한 김형일님이 협조해 주셨습니다.

https://assetstore.unity.com/packages/3d/characters/humanoids/perfect-knight-4889








Unity Standard Shader Sample version



StandardShader.zip



압축된 파일을 풀면 4개의 파일이 나옵니다.


UnityKorea/StandardSmoothenss

UnityKorea/StandardSmoothenssAlphaTest

UnityKorea/StandardRoughness

UnityKorea/StandardRoughnessAlphaTest



Shader파일은 Unity Project 폴더 아무곳에나 넣으면 동작합니다.(보통 Shader폴더를 만들어 넣습니다.) 기본적인 환경 셋팅은 아래 링크에서 확인 할 수 있습니다.


Unity Look dev를 위한 Setting : http://illu.tistory.com/1262






Color : 전체 색상을 조절합니다.

Albedo : Albedo 텍스쳐를 사용합니다. 

Normal Map : Normal texture를 사용합니다.

Norma Intensity : Normal의 세기를 조절합니다. (Normal texture의 G채널 값만 변경됩니다.)


간혹 맥스나 언리얼에서 사용하던 노멀맵이 뒤집혀 있는 경우가 있습니다. -1을 입력해 제대로 나온다면 노멀 텍스쳐의 G채널을 반전시켜주세요


Masking Texture

R : Metallic
G : Occlusion 
A : Smoothness, Roughness

각각이 RGB 채널을 사용하며 아래 각각의 파라메터로 조절이 가능합니다.


Smoothness와 Roughness는 각각의 값이 반전되어 계산되므로 어떤 Shader를 쓰던지 무방합니다. 다만, Roughness로 export된 Texture를 Smoothness에서 사용하려면 Smoothness 값을 1이 아닌 0을 기준으로 조절하면 됩니다.





Specular - Glossness map을 Roughtness-Metallic map 으로 바꾸어 줍니다.




Occlusion texture를 사용할 경우에는 아래 토글을 활성화 시켜주고 사용해주기 바랍니다. 이는 Masking texture의 제작시 검정 바탕으로 제작하는데 텍스쳐를 사용하지 않을경우 케릭터가 검게 적용되기 때문에 사용할 경우에만 활성화 하도록 합니다.




Emissive Parameter

부분적으로 빛나는 효과를 주기 위해서 활성화 하는 메뉴입니다. RGB값을 모두 사용하며 컬러를 추가로 설정할 수 있습니다.




Toggle : 항목을 활성화 합니다.


Emissive Color :  Emissive 항목의 Color를 설정합니다.


Emissive Texture : Emissive texture를 설정합니다. RGB 컬러 모두 적용됩니다.


Emissive Inten : Emissive의 세기를 결정합니다.








Off : 2side :  2사이드를 위한 메뉴입니다. 



면을 앞뒤로 그립니다.(면을 앞뒤로 그리기 때문에 Tri(폴리카운터)가 2배로 늘어납니다. 가능하면 필요한 부분의 뒷면을 만들어 붙이는 쪽을 추천드립니다.


front : culling front. 뒷면만 그립니다.

back : culling back. 앞면만 그립니다(이 옵션이 기본 설정입니다)




AlphaTestShader는 0과1만을 가지므로 알파텍스쳐를 사용할 경우에 쓰입니다.







Window/Lighting/Settings 항목을 열어서 나타나는 Lighting 메뉴에서 Realtime이 체크되어있으면 Environmet Reflection 항목에 체크된 리소스를 사용해서 환경 광원을 계산하게 되나(보통 Skybox) 임의로 설정해서 사용할 수 있습니다.






우선, 붉은 박스안의 체크를 해제합니다.







Hierarchy menu의 Light에서 Reflection Probe를 만들어 줍니다.






프로젝트에 있는 HDR 텍스쳐 property를 2D에서 Cube로 바꾸어 주어야 합니다, 그러면 이 소스를 Reflection probe에 적용할 수 있습니다. Type을 Custom으로 바꾸고 select를 누르면 프로젝트에 있는 HDR소스중에서 선택할 수 있습니다.







Reflection probe를 선택하면 노란 실선이 보이는데 이 실선 안에 있어야 Reflection probe의 적용을 받습니다. 범위는 Box size에 있는 값으로 조절이 가능합니다.








이를 활용해 다양한 환경에 따른 결과를 미리 확인할 수 있습니다.



마지막으로 ambient color는 skybox를 사용해도 되지만 Color 설정으로 설정해 주었습니다.



이미지는 검정이지만 조금 다른 톤을 추가해 주었습니다. (이걸 취향껏 설정을~)




추가로 Post Processing 적용 관련 가이드는 아래 링크를 통해 확인 할 수 있습니다.


Resource Export (1) : http://illu.tistory.com/1264
Unity Setting (2)     : http://illu.tistory.com/1269
Post Processing (3) : http://illu.tistory.com/1272

Post Processing (4) : http://illu.tistory.com/1274










아래는 Shader 코드입니다.




Shader "UnityKorea/StandardSmoothness" {
   
   
    Properties {
   
      [Header(Simple StandardShader)]
         [Space(20)]
       
        _Color ("Color", Color) = (1,1,1,1)
       
       
      [Space(20)]
       
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
       
        [Normal][NoScaleOffset]_BumpMap("Normal Map", 2D) = "bump" {}

        [Space(10)]
        _BumpScale("Normal Intensity", Float) = 1.0
       
        [NoScaleOffset]_MetallicGlossMap("Meatllic(R), Occlusion(G), Smoothness(A)", 2D) = "white" {}
   
   
   
       [Space(20)]
       
        _Metallic ("Metallic", Range(0,1)) = 0.5
        _Glossiness ("Smoothness", Range(0,1)) = 0.5


        [Space(10)]       
        [MaterialToggle(_Ocu_ON)] _Ocu("Occlusion Toggle", float) = 0
        _OccInten("Occlusion", Range(0, 1)) = 1

       
        [Space(30)]
        [Header(Emissive Parameter)]
        [MaterialToggle(_Emi_ON)] _Emi("Emissive Toggle", float) = 0
        _EmissiveColor("Emissive Color", Color) = (1,1,1,1)
        _EmissiveTex ("Emissive Texture(RGB)", 2D) = "white" {}
        _EmissiveInten("Emissive Inten", Range(0, 5)) = 1

       
        [Space(20)]
        [Enum(UnityEngine.Rendering.CullMode)] _Cull ("Off : 2side", Float) = 2
       
       
    }
   
   
   
    SubShader {
       
        Tags { "RenderType"="Opaque" }
        LOD 200
        Cull [_Cull]
       


        CGPROGRAM
       
        #pragma surface surf Standard fullforwardshadows
        #pragma target 3.0
        #pragma shader_feature _Emi_ON
        #pragma shader_feature _Ocu_ON

       

        sampler2D _MainTex;
        sampler2D _BumpMap;
        sampler2D _MetallicGlossMap;
       
       
       

        struct Input {
           
           
            float2 uv_MainTex;
   
    };

   
        half _Glossiness;
        half _Metallic;
        half _BumpScale;
        half _OccInten;
       
        fixed4 _Color;
       
        #if _Emi_ON
       
        sampler2D _EmissiveTex;
        fixed4 _EmissiveColor;
        half _EmissiveInten;
       
        #endif

       
        UNITY_INSTANCING_BUFFER_START(Props)
       
        UNITY_INSTANCING_BUFFER_END(Props)

        void surf (Input IN, inout SurfaceOutputStandard o) {
       
            fixed4 c  = tex2D(_MainTex, IN.uv_MainTex) * _Color;
            fixed3 nm = UnpackNormal(tex2D(_BumpMap, IN.uv_MainTex));
            fixed4 sg = tex2D(_MetallicGlossMap, IN.uv_MainTex);
       
            o.Albedo = c.rgb;
           
           
            o.Normal = nm * fixed3(1, _BumpScale, 1);
       
            o.Metallic   = sg.r * _Metallic;
            o.Smoothness = sg.a * _Glossiness;


            #if _Ocu_ON

            o.Occlusion = sg.g * _OccInten;

            #endif


           
            #if _Emi_ON
           
            fixed3 em = tex2D(_EmissiveTex, IN.uv_MainTex);
           
            o.Emission = em * _EmissiveColor * _EmissiveInten;
           
            #endif
           

           
           
            //o.Alpha = 1;
        }
       
        ENDCG
    }
   
    FallBack "Diffuse"
   
}


반응형