본문 바로가기

개발/컴퓨터 그래픽스

컴퓨터 그래픽스 : Rendering Equation(렌더링 방정식)

이 글은 수학적으로 정확한 정의를 알려주기보다는, 직관적인 이해를 돕기 위해 작성한 글입니다. 그 점 양해부탁드립니다.

 

최근 엔비디아에서 RTX 시리즈 그래픽카드를 계속 출시하면서 일반 소비자들한테도 레이트레이싱이라는 기술이 많이 익숙해지기 시작했습니다. 하지만 이 기술은 최신의 기술이 아닌 오래 전부터 컴퓨터 그래픽스 분야에서 많이 사용되던 기술입니다. 다만 지금까지는 속도의 문제로 인해 리얼타임으로 적용시키지 못했다면, 엔비디아의 RTX 시리즈 그래픽카드는 이를 리얼타임으로 게임에서 구동가능케 해줍니다. 물론 실제 모든 빛을 추적하는 것이 아닌 반사와 굴절 효과에만 사용됩니다. 

 

그림 1) RTX Off, On 비교 사진

 

위 사진을 보면 RTX기능이 OFF / ON의 비교가 나와있습니다. OFF 상태에서는 벽에 비춰지는 유리창이 제대로 비춰지고 있지 않지만, ON 상태에서는 반사의 효과를 매우 잘 표현했습니다. 이처럼 레이트레이싱 기술을 사용하면, 게임을 좀 더 풍성하게 즐길 수 있게 됩니다. 

 

그렇다면 과연 레이트레이싱이 무엇일까요? 레이트레이싱을 단어 그대로 광선을 추척한다는 뜻입니다. 더 자세한 내용은 이 글의 목적과 맞지 않아서 다음에 자세히 살펴보도록 하고, 레이트레이싱 기술에 대해서 조금 더 궁금하신 분은 아래의 동영상을 참고해주세요. 아래의 동영상은 레이트레이싱의 한 종류인 패스트레이싱에 대한 설명을 담은 디즈니 동영상입니다. 이 동영상을 보시면 레이트레이싱이 어떻게 동작하는지에 대한 직관적인 지식을 얻을 수 있을 것입니다.

 

https://youtu.be/frLwRLS_ZR0

 

그럼 이 글에서 이런 레이트레이싱의 근간을 이루고 있는 방정식인 Rendering Equation(렌더링 방정식)에 대해서 설명하고자 합니다. 이 글에서 나오는 수식들은 이전에 제가 작성했던 글에서 유도했던 공식들을 사용하고 있습니다. 만약 제가 작성한 수식들이 이해가 되지 않는다면, 이전에 작성했던 글들을 읽으면서 따라오시면 쉽게 이해하실 수 있을 것입니다.

 

아래 더보기를 누르시면 이전 글의 링크를 보실 수 있습니다.

더보기

2020/09/01 - [개발/컴퓨터 그래픽스] - 컴퓨터 그래픽스 : 입체각(Solid Angle)

 

컴퓨터 그래픽스 : 입체각(Solid Angle)

이 글은 수학적으로 정확한 정의를 알려주기보다는, 직관적인 이해를 돕기 위해 작성한 글입니다. 그 점 양해부탁드립니다. 컴퓨터 그래픽스에 대해서 공부하다 보면, 입체각에 대한 이야기가 �

honey-balm.tistory.com

2020/09/11 - [개발/컴퓨터 그래픽스] - 컴퓨터 그래픽스 : PBR 이해를 위한 배경 지식(1) - Radiometry(방사 분석)

 

컴퓨터 그래픽스 : PBR 이해를 위한 배경 지식(1) - Radiometry(방사 분석)

이 글은 수학적으로 정확한 정의를 알려주기보다는, 직관적인 이해를 돕기 위해 작성한 글입니다. 그 점 양해부탁드립니다. PBR(Physically Based Rendering)에 대해 공부를 하기 위해 책을 본다면, 일반�

honey-balm.tistory.com

2020/09/13 - [개발/컴퓨터 그래픽스] - 컴퓨터 그래픽스 : PBR 이해를 위한 배경 지식(2) - BRDF

 

컴퓨터 그래픽스 : PBR 이해를 위한 배경 지식(2) - BRDF

이 글은 수학적으로 정확한 정의를 알려주기보다는, 직관적인 이해를 돕기 위해 작성한 글입니다. 그 점 양해부탁드립니다. 지난 편에서는 Radiometry(방사 분석)에 대해서 알아봤습니다. 이러한 Ra

honey-balm.tistory.com

2020/09/14 - [개발/컴퓨터 그래픽스] - 컴퓨터 그래픽스 : PBR 이해를 위한 배경 지식(3) - Perfect Diffuse BRDF(반사율)

 

 

그렇다면 이전에 정의한 한 영역에서 방출되는 Radiance, \(L_{o}\)는 아래와 같습니다.

 

$$L_{o}(p,\omega _{o}) = \int f(p, w_{i}, w_{o})L_{i}(p, \omega _{i})\cos{\theta}_{i}d\omega _{i} $$

 

이제 이 식을 좀 더 일반적으로 변경해보겠습니다. 만약 표면이 단순히 빛을 반사하기만 하는 표면이 아니라 빛을 내뿜기도 하는 조명과 같은 표면이라면 어떻게 될까요? 당연히 방출되는 Radiance는 더욱 강해질 것입니다. 이러한 빛의 방출 개념을 위 식에다가 도입하게 되면 아래와 같은 식이 나옵니다.

 

$$L_{o}(p,\omega _{o}) = L_{e}(p, \omega _{o}) + \int f(p, w_{i}, w_{o})L_{i}(p, \omega _{i})\cos{\theta}_{i}d\omega _{i} $$

 

바로 위의 식이 Rendering Equation(렌더링 방정식)입니다. 매우 간단하지 않나요? 사실 렌더링 방정식에는 여러 형태가 있지만 이 형태는 그 중에서도 가장 기본적인 Hemishpere form입니다. 다른 형태의 렌더링 방정식 중 하나인 Area form은 \(d\omega _{i}\)를 \(dA\)의 형태로 바꿔서 구할 수 있지만 자세한 내용은 생략하겠습니다.

 

그렇다면 이제는 이 렌더링 방적식의 해를 구해보겠습니다. 사실 렌더링 방적식은 재귀적인 표현이기 때문에 쉽게 그 해를 구할 수 없습니다. 아래의 그림을 보시면 위 식이 왜 재귀적으로 표현되는지 알 수 있을 것입니다.

 

그림 2) 재귀적인 Radiance 계산

 

위 그림에서 우리는 점 p에서 눈으로 들어오는 Radiance, \(L_{o}\)를 구하고 싶습니다. \(L_{o}\)를 구하는 식은 아래와 같습니다.

 

$$L_{o}(p,\omega _{o}) = L_{e}(p, \omega _{o}) + \int f(p, w_{i}, w_{o})L_{i}(p, \omega _{i})\cos{\theta}_{i}d\omega _{i} $$

 

하지만 위 식에서는 \(L_{o}\)를 구하기 위해서는 \(L_{i}\)를 계산해야합니다. 그러면 \(L_{i}\)를 어떻게 구할까요? 점 p로 들어오는 \(L_{i}\)는 사실 점 p`에서 방출되는 \(L_{o}\)와 동일합니다. 그렇다면 p`에서 방출되는 Radiance는 또 어떻게 구할까요? 이는 또 다시 \(p``\)에서 방출되는 Radiance를 구해야하고 이를 무한히 반복하다보면, 우리는 드디어 눈으로 들어오는 Radiance \(L_{o}\)를 구할 수 있게됩니다.

 

이러한 재귀적인 식의 해를 구하기 위해서 우리는 문제를 간단하게 바꿀 필요가 있습니다. 현재의 렌더링 방정식은 좌변에 구하고자하는 값인 \(L_{o}\)항이 있고 우변에는 우리가 해를 구하는데 방해가 되는 \(L_{i}\)항이 있습니다. 우리는 우변에 있는 \(L_{i}\)항을 처리해야만 이 재귀적인 식의 해를 구할 수 있습니다.

 

하지만 그림 2를 보면 점 p로 들어오는 Radiance \(L_{i}\)는 사실 점 p`에서 방출하는 Radiance \(L_{o}\)와 동일합니다. 즉 \(L_{i}\)를 \(L_{o}\)로 치환할 수 있음을 의미합니다. 즉 \(L_{i}(p, \omega _{i})\)는 아래와 같습니다.

 

$$L_{i}(p, \omega _{i})=L_{o}(p`, -\omega _{i})$$

 

그림은 아래와 같습니다.

그림 3) \(L_{i}, L_{o}\) 치환

또한 p`은 p와 \(\omega _{i}\)로 나타낼 수 있습니다. 이 때 사용된는 것은 레이 캐스팅 연산자입니다. 레이 캐스팅 연산자는 한 점 p에서 특정한 방향 \(\omega _{i}\)로 광선을 쏠 때 가장 먼저 닿는 점의 위치 p`을 반환하는 연산자입니다. 식과 그림은 아래와 같습니다.

 

$$R_{c}(p, \omega _{i}) = p`$$

 

그림 4) 레이캐스팅 연산자

그렇다면 위의 식을 대입해서 우변의 \(L_{i}\)를 제거한 최종적인 렌더링 방정식은 아래와 같습니다.

 

$$ L_{o}(p,\omega _{o}) = L_{e}(p, \omega _{o)} + \int f(p, w_{i}, w_{o})L_{o}(R_{c}(p, \omega _{i}), -\omega _{i})\cos{\theta}_{i}d\omega _{i} $$

 

이제 우리는 위 식의 해를 구하는데 모르는 항은 \(L_{o}\) 하나로 압축했습니다. 그렇다면 렌더링 방정식의 해를 구하기 전에 마지막으로 Linear operator(선형 연산자)에 대해서 알아봅시다. 자세한 설명은 이 글의 범위에 벗어나게 되므로 간단하게 설명하고 넘어가겠습니다.

 

Linear operator의 특징

  • 함수와 비슷한 형태를 가지고 있다. (벡터를 변환시키는 행렬과 비슷하다)
    $$h(x)=(L\circ f)(x)$$
  • 연산자는 선형 연산의 특징을 가지고 있다.
    $$L\circ (af+bg)=a(L\circ f)+b(L\circ g)$$

Linear operator 예

  • $$(K\circ f)(x)\equiv \int{k(x, x`)f(x`)dx`}$$
  • $$(D\circ f)(x) \equiv \frac{\partial f}{\partial x}(x)$$

 

이러한 Linear operator의 특성을 이용하면 최종적으로 구한 렌더링 방정식을 아래와 같이 표현하는 것도 가능합니다.

 

$$L_{o}=L_{e}+K\circ L_{o}$$

 

그렇다면 위 식의 우변에다 위 식을 다시금 대입하면 아래와 같습니다.

 

$$L_{o}=L_{e}+K\circ (L_{e} + K \circ L_{o})=L_{e} + K \circ L_{e} + K^{2} \circ L_{o}$$

 

또 위 과정을 반복한다면 아래와 같습니다.

 

$$L_{o}=L_{e}+K\circ (L_{e} + K \circ L_{o})=L_{e} + K \circ L_{e} + K^{2} \circ L_{o}=L_{e} + K \circ L_{e} + K^{2} \circ L_{e} + K^{3} \circ L_{o}$$

 

최종적으로 위 식은 아래와 같이 수렴하게 됩니다.

 

$$L_{o} = \sum_{ i=0 }^{ \infty } { K^{i}\circ L_{e} }$$

 

그림 5) 렌더링 방정식의 급수

 

위 그림을 보시면 윗줄은 각 항의 Radiance를 보여주고, 아랫줄은 각 항을 더한 최종적인 Radiance를 보여주고 있습니다. 

 

아랫줄 두번째 사진을 보면, 조명이 닿지 않는 그림자 부분은 완전한 검은색으로 표현이 됩니다. 하지만 한 단계 더 진행을 하게 된다면 조명에 직접적으로 닿지 않는 부분도 빛의 반사 효과로 인해 밝아지는 것을 볼 수 있습니다.