본문 바로가기
Computer Graphics/ShaderLab, HLSL

[ShaderLab] Matcap

by 진현개발일기 2024. 3. 10.

■ Matcap이란?

Matcap이란 Material Capture의 준말. Ramp Texture와 같이 이미지로 조명을 대신 사용하는 방식 [IBL; Image Based Lighting]이다. 최적화를 많이 신경써야하는 모바일에서 자주 사용하는 Fake Lighting 기법이다. 라이트를 전혀 사용하지 않고도 조명을 내는 효과를 낼 수 있다.

 

■ 구현

먼저 월드 좌표계 노말을 활용해 라이팅 없이 각 버텍스의 컬러를 조절해주는 설정을 해보겠다.

빛의 영향을 받지 않는 Emission에 월드노말을 대입했을 때 위와 같은 모습을 띈다. 하지만 카메라의 방향과 각도에 따라 달라지게 할려면 아래와 같이 뷰 좌표계를 기준으로 노말을 계산해줘야한다.

View Matrix (뷰 행렬)을 월드 노말에 곱함으로써 뷰 좌표계로 변환헀을 때 아래와 같은 모습을 띄게 된다.

카메라의 위치와 각도에 따라 색깔이 변하는 것을 확인할 수 있다. 

이제 뷰 좌표계 기준 노말의 xy축을 Matcap으로 활용할 텍스처의 uv좌표에 대응하도록 설정했다.

0.5를 곱한 뒤 0.5를 또 더하는 이유는, 노멀맵이 180˚를 표현하기 위해, 노멀이 -1 ~ 1의 범위를 가지고 있으므로 이를 uv의 범위인 0~1로 만들기 위해서이다.  

 

Matcap을 위한 텍스처론 만화 같은 느낌을 갖고 있는 텍스처를 사용했다.

 

이에 rgb값을 곱함으로써 로봇의 원래 색깔을 덮어 표현해줬다.

 

 

다른 Matcap 텍스처를 사용해봤다.

 

 

이렇게 보니 라이트를 전혀 사용하지않고도 용광로 앞에 표면이 비춰지고 있는 로봇의 모습을 표현할 수 있다는 것이 얼마나 최적화에 용이한 지 다시 한 번 생각하게 되었다.

 

▼ 만약에 노말맵을 추가하고 싶다면 아래와 같이 코드를 수정해줘야 한다.

뷰행렬과 월드노말을 곱해주기 전 이전에 공부했던 것과 같이 연산의 대상을 Internal Data로 지정해줘야한다. 

728x90

'Computer Graphics > ShaderLab, HLSL' 카테고리의 다른 글

[ShaderLab] Water  (0) 2024.03.11
[ShaderLab] Refraction  (0) 2024.03.10
[ShaderLab] Dissolve  (0) 2024.03.06
[ShaderLab] 2Pass AlphaBlending  (1) 2024.03.06
[ShaderLab] 알파 블렌딩 (Alpha Blending)  (0) 2024.03.06