TECHARTNOMAD | TECHARTFLOWIO.COM

(출간예정) 모두의 셰이더 프로그래밍

9.8.5 Screen Space Depth 기반 Rim light 따라잡기 도입글 소개

jplee 2025. 2. 9. 18:11

9.8.5 Screen Space Depth 기반 Rim light 따라잡기

게임 그래픽이나 3D 애니메이션 분야에서는 물체의 가장자리를 빛으로 감싸 윤곽선을 돋보이게 만드는 ‘Rim Lighting’ 기법이 자주 사용된다. 간단히 설명하면, 데브 기반 림라이팅이란 물체와 주변 사이의 깊이 차이를 활용해 물체의 에지(가장자리)에만 빛이 닿는 효과를 연출하는 것이다. 이번 장에서는 이러한 림라이팅을 구현할 수 있는 방법에 대해 살펴보려 한다.
림라이팅이 게임 업계에서 본격적으로 사용되기 시작한 시점은 대략 2003년 무렵으로 추정된다(정확한 연도는 명확하지 않다). DirectX 9.0 기반에서 개발이 활발해지던 시기부터, 게임브리오 엔진이나 언리얼 엔진 2.X 등을 사용하던 시대를 거쳐, 현재의 다양한 모바일 게임에서도 상황에 따라 폭넓게 활용되는 범용적인 라이팅 기법이 되었다. 최근 몇 년 전에 출시되어 전 세계적으로 큰 인기를 끌었던 닌텐도 스위치 전용 게임 ‘젤다의 전설: 야생의 숨결’에서도 그들만의 림라이팅 기법이 사용된 것으로 알려져 있다.
프로젝트마다 활용 방식도 다양하다. 예를 들어, 단순 프레넬(Fresnel) 효과를 이용해 피격 이펙트로 구현하거나, 좀 더 발전시켜 인위적인 백라이트(Back Light) 효과처럼 사용할 수도 있다. 이때 물리 기반 렌더링(PBR)에서 쓰이는 복잡한 수식을 굳이 적용할 필요는 없다. 림라이팅은 특히 모바일 게임 개발 현장에서 많이 쓰이기 때문에, 간단하면서도 임팩트 있게 연출하는 것이 주된 목표가 되기 때문이다.
이 절에서는 종종 Toon Rendering 기법에 응용되었던 깊이맵 기반의 림라이팅 예시를 간단히 구현해 보면서, 뎁스 기반 림라이팅의 원리와 실제 적용 방법을 함께 학습해 볼 것이다.

여기서 잠깐! 궁금한 점이 있을 수 있다.
왜? 굳이 Depth 를 활용해서 림라이트를 구현하는지 생각해 볼 필요가 있다. 2019년 즈음까지만 해도 일반적으로 림라이트라고 하면 간단한 프레넬 식으로 구현 하거나 한걸음 더 나가서 림라이트 차폐를 위해 가상의 라이트 벡터를 만들고 도트곱등을 활용하는 등등의 여러 응용법 등을 사용해 왔다.
저자의 기억으로는 중국의 Jason Ma 라는 엔지니어가 화면공간 Depth 를 활용해서 뎁스 기반 림라이트를 툰 셰이딩에 적용한 사례를 오래 전 소개 한 것으로 기억된다. 그 이후 대부분의 툰 셰이더 라이브러리들에 이와 같은 기능이 추가 되어 왔다. Poiyomi Shader 라이브러리 라든가 프로 버튜버들이 자주 사용하는 Nilo Toon 등에도 이미 통합되어진 기능이다. 저자와 함께 어떻게 구현되는 것이지 학습하면서 더 응용해 볼 수 있는 이해의 장이 되기바란다.

 

크게 두 가지를 구현 해 보자.

1. 뎁스 기반의 림라이트 구현을 한다.
2. 디렉셔널 라이트의 ShadowAttenuation 등을 사용하여 고도화 한다.

이러한 선행 지식이 요구 된다..
View Space 공간, Clip Space 공간, Viewport Space, Depth Buffer, smoothstep 함수, lerp 함수.
이 책의 앞 장에서 대부분 다루어 본 곳이다. 일부 다루어지지 않았던 내용은 이 장의 작은 절에서 일부 다룰것이다.