블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2794)
Unity3D (852)
Programming (478)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (11)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
유니티의 그림자 기능은 설정 메뉴가 너무 단순해서 별로 할 게 없어 보입니다.
(렌더러에서 체크박스만 체크하고, 퀄리티에서 옵션 조정하는 것이 전부입니다. )
유니티 그림자 시스템의 특징은 투명한 물체에서는 그림자가 동작하지 않으며, 물체의 메시정보에 의해 그림자가 자동으로 만들어지며, 이를 고칠 수 있는 메뉴구성은 존재하지 않습니다.

하지만 유니티 그래픽 팀에서는 셰이더를 사용하여 직접 내가 그림자 모양을 변경할 수 있는 인터페이스를 만들어 두었는데, 이를 소개해드립니다.
우선 셰이더를 제작하고, 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
 

프로젝트 파일은 아래에서 다운로드 가능합니다.


참고로 특정 영역이 뚫려있는 그림자의 경우 Transparent/Cutout 계열을 사용하면 자동으로 알파를 제외하고 그림자를 생성해줍니다. 



반응형

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

Projector Multiply Offset  (0) 2014.04.03
유니티 3D에서 그림자 설정  (0) 2014.03.29
실시간 그림자  (0) 2014.03.07
Posted by blueasa
, |