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

[ShaderLab] Rim Light, Hologram

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

■ Fresnel (프레넬), Rim Light (림라이트)

 우리 주변을 자세히 살펴보면 모든 물체는 기울어질수록 반사가 심해진다는 것을 느낄 수 있다.

실제로 모든 물체는 길우기가 심할수록 반사가 되며 그 반사율은 재질에 따라 크게 달라진다.

이와 같이 재질과 각도에 따라 빛이 반사되는 세기가 달라지는 현상을 프레넬(Fresnel) 현상이라고 한다.

 

역광을 예로, 털이나 반투명 재질의 물체들은 이 현상이 강렬하게 나타날 수 있고 재질에 따라 때로는 잘 보이지 않게 나타날 수도 있다. 이러한 역광으로 오브젝트의 외곽이 빛나보이는 듯한 현상을 림라이트(Rim Light)라고한다.

 

■ Fresnel 공식 구현

먼저 우리가 엔진에 내장되어 받을 수 있는 변수 중 viewDir인 뷰벡터 [카메라 벡터]를 얻어온다. 우리는 앞서 배운 ndotl [램버트 공식]에서 조명에 따른 노멀의 내적이 아니라 뷰벡터에 따른 노멀의 내적인 ndotv로 변경하고자 한다.

이렇게 처리한다면 카메라가 바라보는 방향이 계속 밝은 상태를 유지하고 그에 따라 나머지 버텍스들은 음영처리를 interpolate하게 처리할 것이다. 

 

[Footage of ndotv]

 

이 결과를 뒤집어보면 아래와 같은 모습을 띠게 된다.

 

현재 ndotv의 크기 변환은 선형적으로 일어난다. 림라이트(RimLight) 구현을 위해선 외곽선을 나타내는 하이라이트 빛의 굵기가 줄어들어야한다. 이를 위해 pow 함수로 제곱해줌으로써 빛의 굵기를 가늘게 해줬다.

 

[After Pow function applied]

하얀색 선이 얇아지니 조금은 림라이트 같이 생겼다.

이제 적용이 되는 것을 확인했으니 림라이트 세기, 컬러, 노말맵을 프로퍼티에 추가해준다.

 

 

이제 주변광 효과를 받을 수 있도록 noambient 키워드를 제거하고 이전 포스팅에 언급했던 주의할점을 되새기며 내적연산에 saturate 함수를 적용함으로써 -1로 넘어가는 부분을 막아준다.

 

 

훨씬 더 부드럽고 자연스러워졌다.

 

■ 홀로그램 (Hologram) 구현

 

먼저 프래그먼트 뒤에 위치한 면들도 보여주기 위해 transparent 처리를 해줬고 alpha는 fade하도록 설정했다.

 

 

입 안에 보이는 것은 사용하고 있는 모델이 혀 안쪽까지 구현되어있기 때문이다. 이는 Z-Buffer를 공부할 때 없애볼 예정이다.

 

이제 입맛대로 홀로그램을 꾸미기 위해 색깔, 굵기 등을 프로퍼티화 했다.

시간에 따라 없어졌다 생겼다하기 위해 아래와 같이 sin함수에 time 매개변수를 넘겨주고 이를 모든 음수를 양수처리하여 그래프가 통통 튀는 느낌이 들게끔 하기 위해 절대값 함수(abs)를 사용하였다.

 

[GIF]

 

 

이제 영화에서 보던 것과 같이 홀로그램에 지지직 거리는 효과를 넣어보겠다.

▼ 프로퍼티 추가

▼ 코드 수정 (램버트라이트는 사용하지 않기 때문에 noLight이름의 커스텀라이트구조 적용)

 

▼Fallback은 그래픽 카드에서 쉐이더 연산을 실패했을 때 대체 쉐이더 이름을 적는 칸이다.

홀로그램은 마치 이펙트와 같은 쉐이더이기 때문에 그림자를 생성할 필요가 없다. 그러므로 Fallback "Diffuse"를 Transparent계열의 쉐이더로 변경하였다.

 

[GIF]

 

 

728x90