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 |