셰도우캐스터(ShadowCaster)를 활용한 그림자 생성 변경
Unity3D/Shadow / 2014. 3. 29. 15:36
유니티의 그림자 기능은 설정 메뉴가 너무 단순해서 별로 할 게 없어 보입니다.
(렌더러에서 체크박스만 체크하고, 퀄리티에서 옵션 조정하는 것이 전부입니다. )
유니티 그림자 시스템의 특징은 투명한 물체에서는 그림자가 동작하지 않으며, 물체의 메시정보에 의해 그림자가 자동으로 만들어지며, 이를 고칠 수 있는 메뉴구성은 존재하지 않습니다.
하지만 유니티 그래픽 팀에서는 셰이더를 사용하여 직접 내가 그림자 모양을 변경할 수 있는 인터페이스를 만들어 두었는데, 이를 소개해드립니다.
우선 셰이더를 제작하고, Pass 구문에 ShadowCaster 라이트 모드를 사용하는 셰이더를 만들면 이 구문에서 물체가 그림자를 생성할 때 이를 가로채 여러분들이 원하는 모양으로 그림자 형태를 변경하는 것이 가능합니다.
아래 그림 중 왼쪽은 위의 기능을 적용한 예이며, 오른쪽은 일반적인 그림자 생성 결과입니다.
이를 위한 셰이더 코드는 다음과 같습니다.
붉은 색으로 표시한 Pass의 Tag 구문의 라이트모드 설정을 잘 활용 하시면 여러 표현이 가능하다~ 는 것을 보여드리기 위해 예제는 최대한 심플하게 만들어봤습니다. (TRANSFER_SHADOW_CASTER 와 같은 매크로들은 UnityCG.cginc에 다 정의되어 있습니다. )
Pass
{
Name "ShadowCaster"
Tags { "LightMode" = "ShadowCaster" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
fixed _Cutoff;
struct v2f {
V2F_SHADOW_CASTER;
float2 uv : TEXCOORD1;
}
v2f vert(appdata_full v)
{
v2f o;
o.pos = mul( UNITY_MATRIX_MVP, v.vertex );
o.uv = v.texcoord;
TRANSFER_SHADOW_CASTER(o)
return o;
}
float4 frag(v2f IN) : COLOR
{
fixed4 c = tex2D( _MainTex, IN.uv );
clip( c.a - _Cutoff );
SHADOW_CASTER_FRAGMENT(IN)
}
ENDCG
}
{
Name "ShadowCaster"
Tags { "LightMode" = "ShadowCaster" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
fixed _Cutoff;
struct v2f {
V2F_SHADOW_CASTER;
float2 uv : TEXCOORD1;
}
v2f vert(appdata_full v)
{
v2f o;
o.pos = mul( UNITY_MATRIX_MVP, v.vertex );
o.uv = v.texcoord;
TRANSFER_SHADOW_CASTER(o)
return o;
}
float4 frag(v2f IN) : COLOR
{
fixed4 c = tex2D( _MainTex, IN.uv );
clip( c.a - _Cutoff );
SHADOW_CASTER_FRAGMENT(IN)
}
ENDCG
}
프로젝트 파일은 아래에서 다운로드 가능합니다.
참고로 특정 영역이 뚫려있는 그림자의 경우 Transparent/Cutout 계열을 사용하면 자동으로 알파를 제외하고 그림자를 생성해줍니다.
반응형
'Unity3D > Shadow' 카테고리의 다른 글
Projector Multiply Offset (0) | 2014.04.03 |
---|---|
유니티 3D에서 그림자 설정 (0) | 2014.03.29 |
실시간 그림자 (0) | 2014.03.07 |