[Unity] 유니티 라이팅(Lighting) 컴포넌트, 빛 표현과 노멀맵(Normal map)

728x90

빛, 라이팅(Lighting)

빛은 음영(그림자)을 표현하는 수단으로 빛의 유무에 따라 2D 콘텐츠인지, 3D 콘텐츠인지가 결정된다.

유니티에서는 기본적으로 3가지 직접광 라이팅 컴포넌트를 제공하고 있다.

(Directional Light, 방향 1개, Point Light, 360도 방향, Spot Light, 50~60도 방향)

 

콘텐츠를 제작할 때 라이팅은 매우 중요한 요소이지만 실시간으로 렌더링 해야 하기 때문에 연산량이 많아 개발을 매우 무겁게하는 요소이기도 하다. 특히, Point Light와 Spot Light는 방향이 광범위한 탓에 기본적인 연산량이 많고 최적화에 문제를 일으키기도 한다. 따라서 정말 필요한 상황이 아니라면 실무에서는 잘 안쓰고 그 대신 Light map을 사용한다.

 

유니티에는 직접광만 제공하는 것이 아니다. 오브젝트에 빛을 비췄을 때 빛이 반사되는 반사광도 제공하고 있는데 대표적으로 난반사, 정반사광, 환경광 3가지가 있다.

(확산광, 난반사, diffuse  /  정반사광,  specular  /  환경광, 주변광, ambient - 그림자, 무한 반사)

간접광에 대한 예시는 쉽게 찾아 볼 수 있다. 유니티 씬에서 기본 Sphere 오브젝트를 생성해보면 다음과 같이 렌더링 된다.자세히 살펴보면 오브젝트의 색상이 조금씩 다른 것을 확인할 수 있다. 우측 상단 가장 밝은 부분은 난반사, 가운데 그라데이션 부분은 정반사, 좌측 하단은 환경광(그림자)이 표현되고 있기 때문에 물리 엔진에서 현실에서 표현되는 구를 그려낼 수 있는 것이다. 또한 여기서 자세히 살펴보면 가운데 부분, 즉 정반사가 표현된 지점이 살짝 푸르스름하게 나타나고 있는 것을 볼 수 있다. 그 이유는 environment material이 기본적으로 skybox으로 지정되 푸른 빛을 반사하기 때문임을 확인할 수 있다.

 

Material에 Shader을 입혀서 diffuse / specular / ambient를 바꿔 테스트 해주면 그 특징을 자세히 확인해 볼 수 있다.  

애니메이션 업계에서도 유니티와 같은  실시간 렌더링 엔진을 사용하려고 넘어오는 추세이다. 하지만 그래픽 퀄리티 문제가 있는데 특히 빛에 대한 반사광 이슈가 있다. 예를 들어, ambient같은 환경광은 무한 반사이기 때문에 연산량도 많고 최적화에 문제가 있다. 따라서 유니티에서는 실시간으로 반사를 시키기 보다는 '이런 색상이 나올 것이다'라고 미리 정해놓고 있다. Lighting의 Environment 탭에서 source를 color로 바꿔보면 다음과 같이 ambient 부분에 대한 처리를 디테일하게 확인해볼 수 있다. 특별한 경우가 아니라면, skybox로 푸른빛을 반사하지만 애니메이션과 같은 특정 상황에서는 color로 디테일하게 조정해 줄 수 있다.

 

빛과 Normal map

노말맵은 빛이 닿았을 때 X,Y, Z 방향으로 반사한다. X,Y,Z 값이 미세하게 조정되면서 R,G,B의 값이 섞이게 된다. 가장 기본적으로 Z축을 중심으로 직선으로 반사되기 때문에 Blue 값을 위주로 생성되게 된다. z축에서 x방향으로, z축에서 y 방향으로 미세하게 조정될 때마다 blue 값에 red와 green이 섞이게 된다. 그래서 우리가 아는 normal map이 푸른색 바탕으로 생성되는 것이다.

 

따라서 텍스처는 빛에 큰 영향을 받는 요소이다. 울퉁불퉁한 텍스처를 구현하는게 normal map이라면 specular map은 특정 부분을 밝게 만드는 것이고, ambient oculusion(ao)를 추가하여 특정 부분을 차폐해서 어둡게 연출해 줄 수 있다.  

 

728x90