6. 그림자 & LOD(Level Of Detail)

MOON·2022년 7월 15일
0

유니티_3D_SpaceShooter

목록 보기
6/11
post-thumbnail

광원

Directional Light (선광원)
자연광에 가장 가까운 방향성을 가진 라이트
태양광선 하나정도는 기본적으로 사용함


Point Light (점광원)
한 점에서 나오는 조명


Spot Light (스팟광원)
무대 조명과 같은 모양으로 비추는 조명
계산량이 많아서 잘 사용하지 않음



실시간 그림자

유니티는 Directional Light, Point Light, Spot Light 세 가지 광원에 대해 실시간 그림자를 지원함 (Unity 5 부터 지원)

(1) No Shadows
기본 설정값으로 실시간 그림자를 적용하지 않는다

(2) Hard Shadows
실시간 그림자를 표현하나 외곽선을 부드럽게 처리하지않는다 (계단현상이 발생)

(3) Soft Shadows
부드러운 실시간 그림자를 표현하지만 가장 많은 부하를 준다


실시간 그림자는 매우 디테일하게 사물을 보여주지만 컴퓨터에 많은 부하를 준다.
그렇기 때문에 그림자 효과가 필요 없는 3D 모델은 실시간 그림자를 처리 하지 않도록 하는 옵션을 반드시 검토해야 함

3D 모델은 아래 두 개의 컴포넌트를 반드시 포함하고 있다.
(1) Mesh Renderer
(2) Skinned Mesh Renderer

위의 두 개의 컴포넌트에는 실시간 그림자와 관련된 속성이 있음


Cast Shadow : 물체의 그림자를 그릴 것인가에 대한 여부
off : 그림자를 만들지 않음
on : 그림자를 만듬
Two Sided : 백페이스 컬링을 무시하고 그림자를 양면으로 만듬

  • Quad 같은 단면만 렌더링 하는 모델의 경우 Cast Shadow 속성을 On 으로 해도 그림자가 만들어 지지 않음. 그렇기 때문에 Two Sided로 설정하면 그림자를 생성할 수 있다.

Shadow Only : 그림자를 만들지만 자신은 렌더링 하지 않음. 즉, 화면에 보이지 않는 특성이 있어 그림자 처리만을 위한 3D 모델에 활용할 수 있음

Receive Shadows : 이 물체의 표면에 다른 물체의 그림자를 그릴것인가에 대한 여부


메시를 이용한 그림자


메시를 이용한 그림자 (1)

Player에 적용된 실시간 그림자가 생성되지 않도록 한다.
slade_mesh, slade_meshLod1, slade_mashLod2의 세개의 메시를 선택 한 후 Skined Mesh Renderer 컴포넌트의 Cast Shadows속성을 off로 변경 , Receive Shadow 속성 언체크


메시를 이용한 그림자 (2)

주인공이 들고 있는 총도 실시간 그림자가 되지 않도록 설정
w_rifle01를 선택하고 Mesh Renderer 컴포넌트의 Cast Shadows와 Receive Shadows 속성을 설정

메시를 이용한 그림자 (3)

그림자로 사용할 발판 만들어 보자
[GameObject] -[3D Object] - [Quad] 생성
생성한 Quad를 Player 게임오브젝트 밑으로 드래그앤드롭
이름 : Shadow
Transform 속성을 아래와 같이 수정
Quad의 Mesh Collider 컴포넌트는 삭제한다.

Z-fighting (or Plane - fighting) 현상

  • y축 값을 0.01(약 1cm)로 설정한 이유는 y축 값이 0일 경우 Floor와 겹쳐지는 부분에 깜빡이는 현상

메시를 이용한 그림자 (4)

평면에 그림자 투영하기
Resources / Textures 폴더에서 BlobShadow.psd 파일을 04.Images폴더로 드래그 앤 드롭
BlobShadow Material 에서 쉐이더 속성을 변경
[Mobile] - [Particles] - [Multiply] 로 변경
Shadow 평면에 적용한다.



Project를 이용한 그림자


Project를 이용한 그림자 (1)

Projector 기능

  • 데칼(Decal)을 구현 할 때 아주 유용하게 활용, 그림자, 총탄 흔적, 혈흔 등의 표현에 사용됨

Assets 임폴트

  • Window 메뉴 - General - Asset Store를 선택 한 후 Asset store 브라우저 창에서 “Standard Assets”를 검색 한 후 임포트를 한다
    Projectors 패키지만 선택 한 후 임포트를 한다.


Project를 이용한 그림자 (2)

우선 Directional Light의 그림자 타입을 “No Shadows”로 설정함
Projector 프리팹 중에서 Blob Shadow Projector를 Player 게임 오브젝트로 드래그앤 드롭 (차일드 화)
Up 방향으로 프로젝트를 올리면 희미한 그림자가 나타남
Projector의 Near Clip Plane을 6.0으로 수정
Near Clip Plane에 가까우면 진하게 표현되고 Far Clip Plane으로 갈수록 Fade out됨

  • Player가 점프해 공중으로 떠 올랐을 경우 바닥에 표현되는 그림자의 농도는 높이에 비례해 연해지는 효과를 연출할 수 있음


Project를 이용한 그림자 (3)

Ignore Layers속성을 지정한 그림자 범위 설정 방법

Edit - Project Settings - Tag and Layers
0~5번까지 할당되어 있음. 6번부터 사용할 수 있음
6번 레이어에 “PLAYER”라고 신규 레이어 추가
PlayerModel를 선택하고 Inspector뷰의 Layer속성을 PLAYER로 지정
레이어 지정시 Child객체가 있을경우 모두 적용
Blob Shadow Projector 의 Ignore Layers속성을 PLAYER로 설정


Project를 이용한 그림자 (4)

유니티에서 사용되는 레이어는 포토샵의 레이어처럼 z-order를 갖고 있지 않다.
즉, 여러 게임오브젝트를 물리적인 계층으로 분리한 것이 아니라 특정 게임오브젝트들을 그룹화해서 특정 효과에 영향을 받을지 말지를 결정하는데에 사용됨

대표적인 예로 Light에서 비추는 빛이 특정 레이어에만 선택적으로 영향을 미치게 하거나 카메라가 보는 시야에서 특정 레이어는 제외하는 기능이 있음



LOD

카메라와의 거리에 따라서 멀리 떨어질수록 낮은 폴리곤으로 변경해 렌더링 부하를 줄여주는 방법
주인공 캐릭터는 카메라와의 거리에 따라 3개의 모델이 합쳐진 상태

slade_mesh : High Polygon (2056 Vertices / 3176 Tris)
slade_meshLod1 : Middle Polygon (708 Vertices / 820 Tris)
slade_meshLod2 : Low Polygon (379 Vertices / 330 Tris)


LOD Group 컴포넌트 만들기
[Component] - [Rendering] - [LOD Group] 컴포넌트 추가
LOD Group은 3단계의 LOD 구간과 Culled 구간으로 설정되어 있음
마지막 Culled는 카메라와의 거리가 아주 멀리 떨어져 화면에서 렌더링 하지 않는 구간을 의미

카메라를 이동하면서 씬 뷰에서 LOD가 반영되는지를 테스트해 본다
구간의 개 수를 늘리고 줄일 수 있음

이것으로 그림자와 LOD를 통해 진행해 보았다.

profile
나만의 공간

0개의 댓글