사진 출처 : What is Rim Lighting? - NYIP Photo Articles

위의 사진을 보면, 동물의 테두리 부분이 밝게 빛나는 것을 볼 수 있다.

이처럼, 광원을 등지고 있을 때 물체의 테두리가 밝게 빛나는 것을 림라이트 혹은 역광이라고 한다.

 

이 림라이트는 현실에선 빛을 등지고 있을 때 나타나지만, 컴퓨터 그래픽스에선 특정 물체를 강조하거나 배경과 분리하기 위해 사용되기도 한다.

 

여기서 설명할 림라이트는 광원의 위치를 고려하지 않는 림라이트이다.

기본적으로 림라이트는 외곽선을 강조하기 위해 사용된다.

그러므로 물체의 외곽을 구별하는 것이 중요하다.

 

어떻게 외곽을 구분하는가?

위의 그림을 보자.빨간색 화살표는 해당 부위의 노말벡터를 표현한 것이다.

외곽이라고 하면, 카메라가 바라보고 있는 방향으로부터 수직에 가까운 경우가 많다.

위의 그림을 보면, 표현한 빨간 화살표는 사진 평면과 평행에 가까울 것이다.

 

하지만, 카메라가 바라보고 있는 동물의 몸통 한가운데에서 뻗어나오는 노말이라고 한다면, 카메라를 향하는 벡터와 유사할 것이다.

 

즉, 물체에서 카메라를 향하는 방향과 물체의 노말의 사잇각이 90도에 가까울수록 외곽이라고 판단할 수 있으며, 0도에 가까울수록 물체의 중심쪽이라고 판단할 수 있을 것이다.

 

두 벡터의 사잇각은 내적을 통해 구할 수 있다.

 

카메라를 향하는 방향 벡터  : v

물체의 노말 벡터 : n

 

위와 같이 가정한다면, 두 벡터의 사잇각은 dot(v, n)이 된다. (v , n 은 유닛벡터라고 가정하자.)

90도에 가까울수록 외곽이라고 했으니, dot(v,n)이 0에 가까울수록 외곽선이고 림라이트는 강해질 것이다.

 

그러므로 림라이트 공식은 아래와 같이 표현할 수 있다.

RimLight = (1 - dot(v, n));

 

이 RimLight를 픽셀의 컬러에 더해주면 물체의 테두리에 림라이트를 적용할 수 있다.

하지만, 위 공식 그대로만 계산하게 되면 몇 가지 문제가 있다.

 

 

 

이는 게임에서 위 공식대로 직접 적용한 것이다.

물론 림라이트가 잘 적용된 것을 볼 수 있다. 그런데 무슨 문제가 있다는 것일까?

엄밀히 말하자면, 문제가 있다기보단 빛의 강도나 범위 등을 조절할 수가 없다는 것이다.

 

상황에 따라 림라이트를 더 강하게 넣고 싶을 수도 있고, 더 약하게 넣고 싶을 수도 있는데 말이다.

그렇기 때문에 RimLight를 계산하는 식에는 몇 가지 변수가 더 추가된다.

 

먼저 강도이다. 외곽을 얼마나 더 빛나게 할 것인가를 조절하는 Strengh이다.

RimLight = (1 - dot(v, n)) * Strength;

 

이렇게 간단하게 값을 곱해주기만 하면 된다.

 

이렇게 Strength의 값에 따라 빛의 밝기가 달라지는 것을 알 수 있다.

다만, 이 경우엔 Strength가 커질수록 림라이트가 적용되는 범위또한 넓어지고 있다.

빛을 밝게 하되, 외곽선만 강조하고 싶은 경우엔 한 가지 변수를 더 추가할 수 있다.

 

Specular Light를 강조하기 위해서, 거듭제곱을 하는 것과 동일하다.

 

RimPower라는 변수를 연결한 뒤, 해당 변수의 값만큼 거듭제곱을 진행해주면 된다.

 

RimLight = (1 - dot(v, n));

RimLight = pow(RimLight, RimPower);

RimLight = RimLight * Strength;

 

위의 결과를 보면, Strength가 동일한 상태에서 RimPower를 조절하니 빛이 적용되는 범위가 외곽으로 집중되는 것을 확인할 수 있다.

+ Recent posts