1. Shader를 적용시킬 스켈레톤 오브젝트 생성

 

2. Skeleton에 적용시킬 Material & Shader / Sword에 적용시킬 Material & Shader 생성

 

2. Skeleton Shader 코드 수정하기

Shader "Custom/Skeleton"

{
    Properties
    {
        _MainTex("Main Texture", 2D) = "white" {}
        _Color("Main Tex Color", Color) = (1,1,1,1)
        _BumpMap("NormalMap", 2D) = "bump" {}
        _Outline_Bold("Outline Bold", Range(0, 1)) = 0.1
        _Band_Tex("Band LUT", 2D) = "white" {}
    }

    SubShader
    {
        Tags { "RenderType" = "Opaque" }

        cull front

        Pass
        {
            CGPROGRAM
            #pragma vertex _VertexFuc
            #pragma fragment _FragmentFuc
            #include "UnityCG.cginc"

                struct ST_VertexInput
                {
                    float4 vertex : POSITION;
                    float3 normal : NORMAL;
                };

                struct ST_VertexOutput
                {
                    float4 vertex : SV_POSITION;
                };

                float _Outline_Bold;

                ST_VertexOutput _VertexFuc(ST_VertexInput stInput)
                {
                    ST_VertexOutput stOutput;

                    float3 fNormalized_Normal = normalize(stInput.normal);
                    float3 fOutline_Position = stInput.vertex + fNormalized_Normal * (_Outline_Bold * 0.1f);

                    stOutput.vertex = UnityObjectToClipPos(fOutline_Position);
                    return stOutput;
                }


                float4 _FragmentFuc(ST_VertexOutput i) : SV_Target
                {
                    return 0.0f;
                }

            ENDCG
        }

        cull back

        CGPROGRAM

        #pragma surface surf _BandedLighting

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_Band_Tex;
            float2 uv_BumpMap;
        };

        struct SurfaceOutputCustom
        {
            fixed3 Albedo;
            fixed3 Normal;
            fixed3 Emission;
            half Specular;
            fixed Gloss;
            fixed Alpha;

            float3 BandLUT;
        };

        sampler2D _MainTex;
        sampler2D _Band_Tex;
        sampler2D _BumpMap;

        float4 _Color;

        void surf(Input IN, inout SurfaceOutputCustom o)
        {
            float4 fMainTex = tex2D(_MainTex, IN.uv_MainTex);
            o.Albedo = fMainTex.rgb;
            o.Alpha = 1.0f;

            float4 fBandLUT = tex2D(_Band_Tex, IN.uv_Band_Tex);
            o.BandLUT = fBandLUT.rgb;

            float3 fNormalTex = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
            o.Normal = fNormalTex;
        }

        float4 Lighting_BandedLighting(SurfaceOutputCustom s, float3 lightDir, float3 viewDir, float atten)
        {
            float3 fBandedDiffuse;
            float fNDotL = dot(s.Normal, lightDir) * 0.5f + 0.5f;
            
            fBandedDiffuse = tex2D(_Band_Tex, float2(fNDotL, 0.5f)).rgb;



            float3 fSpecularColor;
            // 빛을 받는 스펙큘러 컬러
            float3 fHalfVector = normalize(lightDir + viewDir);
            float fHDotN = saturate(dot(fHalfVector, s.Normal));
            float fPowedHDotN = pow(fHDotN, 500.0f);

            float fSpecularSmooth = smoothstep(0.005, 0.01f, fPowedHDotN);
            fSpecularColor = fSpecularSmooth * 1.0f;



            float4 fFinalColor;
            fFinalColor.rgb = ((s.Albedo * _Color) + fSpecularColor) * fBandedDiffuse * _LightColor0.rgb * atten;
            fFinalColor.a = s.Alpha;

            return fFinalColor;
        }

        ENDCG
    }
}

※ 2Pass 외곽선을 사용하여 스켈레톤의 외곽선을 애니메이션 캐릭터처럼 두껍게 처리

※ 빛을 투과받는 효과를 설정하여 갑옷과 해골의 머리부분에 빛이 반사되도록 처리

 

3. Sword Shader 코드 수정하기

Shader "Custom/Sword"
{
    Properties
    {
        _MainTex("Albedo (RGB)", 2D) = "white" {}
        _Color("Color",Color) = (1,1,1,1)
    }

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

         CGPROGRAM

         #pragma surface surf Standard Lambert noambient alpha:fade


         sampler2D _MainTex;
         float4 _Color;

         struct Input
         {
             float2 uv_MainTex;
             float3 viewDir;
             float3 worldPos;
         };

         UNITY_INSTANCING_BUFFER_START(Props)
         UNITY_INSTANCING_BUFFER_END(Props)

         void surf(Input IN, inout SurfaceOutputStandard o)
         {
             fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
             float rim = saturate(dot(o.Normal, IN.viewDir));
             // saturate함수 사용

             rim = pow(1 - rim,3) + pow(frac(IN.worldPos.g * 5 - _Time.y),30);
             // time을 활용하여 깜빡이도록 설정

             o.Emission = float3(0,1,1);
             o.Alpha = rim;
         }
         ENDCG
     }
    FallBack "Diffuse"
}

※ 스켈레톤이 들고 있는 검에 홀로그램 효과를 부여 & rim에 time을 활용하여 깜빡임 효과 설정

 

※ 구현영상

 

 

'Unity3D > Graphic' 카테고리의 다른 글

쉐이더(Shader)  (0) 2021.12.15
Unity_파이프라인(Pipeline)이란?  (0) 2021.09.06
<Graphic> UV애니메이션 활용 Fire Shader  (0) 2021.03.12
<Graphic> Shader 챕터 1  (0) 2021.01.31

+ Recent posts