Spherical Harmonics(구면조화함수, 이하 SH)가 다른 곳에서는 얼마나 쓰이는지 모르겠다. 양자역학에서는 angular momentum 부분에서 쓰이는데, 렌더링 쪽까지 주욱 보니까 양자역학이나 컴퓨터 그래픽외에도 여러 곳에서 쓰일 수도 있다는 생각이 들었다(트위터를 통해 사운드에 관련된 부분에서도 사용된다는 얘기를 얼핏 듣긴 했다).
컴퓨터 그래픽에서의 SH는 사실 물리학에서 사용하는(즉, angular momentum 부분의) SH를 그대로 가져온 것은 아니었다. 실제로 물리적인 모델이 컴퓨터 그래픽에서 쓰이는 경우가 많았지만, 이 경우는 그런게 아니었기 때문에 물리학의 SH 와 컴퓨터 그래픽의 SH 가 연결이 되지 않아서 처음엔 혼란스러웠다.
글은 아마도 두 세개의 글이 될듯 하고, 세 파트로 이루어져있다.
- 수학적인 모델의 설명(지금 이글).
- 물리학에서의 SH
- CG에서의 SH
3번을 위해서 2번을 볼 필요는 없다. 3번은 사실 여러개로 나뉘어질 가능성도 있다.
수학적 정의
실제 특성을 자세하게 알아보는 것이 아니라면 그렇게 어렵지 않다. 하지만 그런걸 지향하기보다는 수학적으로 엄밀하게 따라갈 수 있도록 글을 쓰려고 한다. 일단은 왜 이런걸 쓰는지는 생각하지 않고 일단은 말그대로 수학적 정의만 살펴보는걸로 시작한다.
SH 함수의 기본 모양은 이렇게 생겼다(l 은 ‘아이’가 아니라 ‘엘’이다).
m 은 지수(Y의 m 승)가 아니다. m 과 l 은 각각 함수의 모양을 나타내는 숫자이다. 즉, 과
은 그냥 모양이 다르게 생긴 함수다. 뭘 의미하는지는 천천히 보기로 한다.
SH에서 spherical이 말하듯이, 이 함수는 구면 좌표계로 표현된다. 구면 좌표계는 다들 알다시피 일반적으로 로 표현된다.

9개의 함수가 있다. 각 함수는 괴상한 모양과 각 함수의 오른쪽 상단의 구 모양의 함수로 보여지고 있다.
첫번째 그림에서 첫번째 줄은 m=0, l=0인 함수다. 두번째 줄은 모두 m=1이고, l은 왼쪽부터 -1, 0, 1에 해당한다. 세번째 줄은 추측할 수 있듯이, m=2이고, l은 -2, -1, 0, -1, 2이다.

이건 위의 9개의 함수중 m = 2, l = 0 인 함수다. 오른쪽 상단에 있는 구는 의 값을 색깔로 표현한 것이다. 이 때 구의 반지름에 해당하는 r은 모두 같은 값으로 해두고 색깔로 함수의 값을 구분하는 표현 방법이다 (eg. r=1).
반면 중앙에 크게 보이는 그래프는 값이 색깔이 아니라, 반지름 r 값이 된다. 그렇기 때문에 모양이 가지각색으로 보인다. 이쪽 표현이 좀 더 이해하기 쉬운 거 같다. 여기서 중요한건 l과 m의 값에 따라 함수의 모양이 다르다는 것.
사실 SH 함수의 정의도 아직 말하지 않았다. 함수의 정의는 다음과 같다(이 함수가 왜 이런 모양을 가지는 지를 자세히 볼 필요는 없다).
이제 이 SH 함수는 복소수라는 것을 알 수 있고 (여기서 N 은 normalize 용 상수), 여기서 P 는 associated Legendre[1] polynomials 이다. 이건 또 어떻게 생겨먹었냐 하면,
- Legendre Polynomials :
- Associated Legendre Polynomial :
이렇게 괴상하게 생겼다. 이것 역시 왜 이게 이렇게 생겼는지 자세히 볼 필요는 없다. 단, 왜 이런 괴상한 함수가 생겼는지가 궁금하다면 위키피디아를 비롯한 다른 참고 자료를 참고하면 되겠다. 좀 복잡해 보일 수 있는데, 실제로 필요한 것들만 걸러 받아들이면 된다. 여기서 필요한건 이러한 함수의 특성이다.[2]
일단, SH 함수의 수학적 형태는 알 수 있게 되었다. 아니, 형태는 그림을 보고 알면 되고, 그냥 l과 m에 따라 여러 형태가 존재한다는 것만 기억하면 된다.
어려워 보일 수 있지만, 사실 위의 polynomial 들을 모두 이해할 필요는 없기 때문에 별로 어렵지 않다. 여기에 핵심만을 몇개 덧붙여보면 다음과 같다.
에 따라 다양한
함수 모양이 존재 한다.은 0 부터 무한대까지의 값을 가지며,
은
부터
까지의 정수를 갖는다.
- 실제
는 복소수 값이다(CG 에서는 이걸 실수 함수로 재정의해서 쓴다).
- SH는 associated Legendre polynomials 를 통해 표현 되는데, 함수 내용을 깊이 알 필요는 없다.
Project and Reconstruction (투영과 복원)
예를 들기 위해 3차원 점을 생각해본다. 3차원의 점은 원래
이렇게 표현해야한다. 그런데 우리가 기본적으로(공통적으로)
를 알고 있으면
는 이제부터 신경쓰지 않아도 된다. 바꿔 말하면, 이제부터는 x, y, z만 알면 p 를 얻을 수 있다(여기서 3차원 공간의
를 basis 라 부른다). SH는 이 개념과 비슷하다.
일단 이론적으로 모든 구형 연속 함수(spherical continuous function) f는 다음과 같이 무한개의 SH 조합으로 바꿀 수 있다.
이처럼 함수 f를 계수 와 SH 함수
의 조합으로 나타내는 것을 확장(expansion)이라 부른다. 근사 값이 아니라는 것과 무한대에 주목. 3차원 공간의 p는 3차원이라서 3개의
만 사용하지만, 여기서는 무한대의 개수가 필요하다. 물론 수학적으로 정의/증명됐을 뿐 이거 자체로는 정확한 계산은 하기 힘들다.
어찌됐건, 여기서 중요한건, 이론적으로 모든 를 안다면(ㅡ_ㅡ^)
를 알 수 있는 것이다.
이쯤 되서 잠시 직교성에 대해서 알아보자. 3차원 공간에서 는 서로 직교(orthogonal) 관계에 있다고 말한다. 즉, 전혀 방향이 다르고, 셋 중에 둘, 셋이 합쳐서 벡터를 이루어도, 각각의 값들은 서로 영향을 주지 않는다.
SH에서도 동일하다. 과
에서 m과 m’ 혹은 l과 l’ 둘 중 하나만 값이 달라도 서로 직교한다[3]. 단지 3차원이 아니라 무한대의 차원이라는게 다르다.
만약 이 3차원의 벡터 p 에서 x 혹은 y를 구하려면 어떻게 해야할까? 아주 쉽다. 이렇게 내적(inner product) 연산을 해주면 된다. 이러한 내적 연산은 투영(projection)이라고도 부르는데, 실제 SH에서도 k 를 구하는 과정을 투영이라 부른다.
대신 SH에서 투영 계산 방법은 약간 다르다. 같은 것들은 변하지 않는 벡터지만, SH는 상수가 아니라 함수다. 함수의 경우는 적분을 해서 직교성을 증명해야한다.
즉, 과
이 서로 직교하다는 것은 다음과 같은 방법으로 표현한다.
에서 n, n’이 같으면는 1, 다르면 0이다. 이 직교성을 이용하면, 이제 함수 f로부터 원하는
값을 적분 한방에 빼올 수 있다.
즉, 그냥 간편하게, 함수에다가 원하는 l, m에 대응하는 SH 함수를 적분하면 된다. 물론 계산은 Monte Carlo 등의 적분 알고리즘을 사용해서 컴퓨터가 계산하도록 하면 된다.
투영을 해보았으니, 이제 k 값을 이용해 원래 값을 얻어내는데, 이것은 사실 처음에 보여줬다.
앞서 말했듯이 이걸 확장(expansion)이라 부르는데, 지금 이처럼 투영한 k 값들로부터 얻어낼 경우는 복원(reconstruction)라고 한다.
Approximation (근사)
여기까지 약간 요약해보자. 아주아주 복잡한 함수 f 가 있다. 그런데 이 함수가 구면 연속 함수라면, 아무리 복잡해도 이걸 무한개의(-_-ㅋ) 실수 로 투영할 수 있고, 그걸 다시 복원하면, 원래 함수 f 를 얻을 수 있다.
학부 때 물리 교수님이 우스개소리로 그러셨다. 뭔가 물리 계산을 하다가 무한대가 나오면 틀린거라고....
물론 여기서는 틀린건 없지만, 무한대가 필요하니 일단 적어도 컴퓨터에서는 쓸 수가 없다. 이걸 무한개 대신 100개로 줄여보자. 그러면 f에서 100개의 계수 이 나오고, 이걸 다시 복원하여, f 의 근사치인 f’를 얻게 된다.

왼쪽 원래 함수(Original Function)에 아주 복잡해 보이는 함수 f 세개가 있다. 이 함수를 개의 k 로 투영 했다가 다시 복원했을 경우 어떻게 보이는지가 오른쪽에 나타나 있는 것이다. 원래 무한대가 필요하지만, 초반 몇십개만 가지고 사용했을 경우 어떻게 보이는지를 나타내주는 그림이다. 복잡한 모양을 복원할 수는 없지만, 얼핏 비슷한 모습은 만들어 낼 수가 있다.
이렇게 되는 이유는 초반일 수록 저주파(low frequency)이고, 후반일 수록 고주파(high frequency)이기 때문이다. 저주파는 뭔가 큼지막한 형태를 만들어주는 거고, 고주파는 세밀한 것을 만들어주는 것이다. SH의 핵심은 저주파는 남기고, 고주파는 버리겠다는 의미다. 그걸 그래픽에서 어떻게 쓸 수 있느냐는 다음 글에서 보여지겠지만, 어쨌거나 이 저주파만을 남길 수 있다는 것은 이점이 된다.
하지만, 이 k의 개수를 주목해보자. n을 통해 n번째 차수(n-th order)라 부르는 데, 이 때 k의 개수는 개이다[4]. 즉, n=10일 경우 100개나 필요하다. 100개나 써도 원래 함수와 비교하면 별로 만족스럽지 않다. 이는 다음글에서 조금은 더 자세히 다루겠지만, SH의 장단점을 잘 알려주는 중요한 부분이다. 실제 실시간 렌더링에서는 3차~5차 차수 정도만 쓴다고 한다.
이렇게 하면 기초적인 이론이 끝났다. 아마도 FT(Fourier Transformation)을 아는 사람이라면, 그것과 방식이 거의 같다는 것을 알 수 있다[5].
마지막으로 간단 요약
- 복잡해보이는 함수가 있다. 이 함수를 몇개의 숫자로 변환한다,
- 사실 무한개가 필요하지만, 앞에 몇개만을 활용하여 근사치를 활용 할 수 있다. 물론 상황에 따라서는 아에 수십개로는 택도 없을 수 있다(적어도 CG에서는 많이 사용하지 않는 범위 내에서 활용하는 것이다).
- 사전에 이 숫자를 투영을 사용하여 변환하고,
- 실전에서 이 숫자를 원래 함수의 근사 함수로 복원해서 사용한다.
끝 -_-ㅋ
다음 글에서는 물리에서는 어떻게 쓰이는지 아주 아주 간단히 다룬 후, 컴퓨터 그래픽에서 어떻게 쓰이는 지를 다룰 예정이다. 컴퓨터 그래픽 부분에서는 단순히 함수를 바꾸는 것 이상의 (재밌는) 일들을 한다. 단순히 투영 & 복원 과정만 사용해서는 SH를 사용할 이유는 거의 전혀 없다. SH 자체도 근사 값인데다, 계산 과정이 아주 가볍진 않다[6]. 하지만 convolution의 개념을 통해, 실시간으로 주변광을 모으거나, 실시간 라이트의 변화를 가져올 수 있는 장점이 있기 때문에 이 방법이 가치가 있다. 자세한건 다음 글에...
참고 자료
- Mathematical Methods for Physicists, Arfken Weber - 유명한 수리물리 책. Spherical Harmonics 자체에 대해서는 내가 본 것 중에 가장 체계적.
- Spherical Harmonics Lighting: The Gritty Details, Robin Green - Sony의 R&D 센터에서 나온 문서로 매우 자세하다. 이 글의 모든 이미지는 이 문서에서 얻었다.
- Spherical Harmonics , Volker Schönefeld - 이 문서 역시 자세하다. 논문 형태도 아니고, 학회 Course 형태인 듯 한데, 관련 정보가 없어서 정체를 모르겠다.
- Legendre 는 프랑스의 수학자 Adrien-Marie Legendre의 이름에서 따왔으며, 르잔드르라고 발음함. [본문으로]
- 내 기억이 맞다면, 학부 수준의 양자역학에서도 이 함수를 자세하게 뜯어서 배우진 않았다. 생각해보면 이 함수를 뜯어서(eg. 증명) 볼 필요는 별로 없을 듯 하다. [본문으로]
- 정확한 표현으로는 정규직교(orthonormal)가 맞는 표현이다. [본문으로]
- 이 차수에 대한 개념은 상황에 따라 다르게 표현된다. Green의 문서나 PRT(Precomputed Radiance Transfer) 논문에서는 n=0이면 SH 함수가 0개임을 뜻하고, n=2일 경우 l이 0~2가 되어, n^2의 개수를 갖는다. 반면, Schönefeld의 문서나 SH를 사용한 Irrdaince를 소개한 논문에서는 n=0은 l=0임을 뜻하도록 하여, (n+1)^2개의 SH 함수를 의미한다. [본문으로]
- FT에서도 비슷하게 frequency domain 으로 변환을 한다. 모든 연속 함수를 다룰 수 있다는 것도, 투영/확장 개념까지도 동일하다. [본문으로]
- 계산 과정에서 독특한 회전 변환이 필요하다. [본문으로]







878835
471
576





댓글을 달아 주세요
ㅎㅎ 마지막 네줄 요약이 쵝오!!
ㅎㅎㅎ 요약, 핵심이 킹왕짱~
역시 스승님!!! 머리에 쏙쏙 들어와요ㅎㅎㅎ
엉엉.... 여기서까지 이러시면 아니되옵니다. ㅜ_ㅜ
이게 뭔 소리야!!! 어서 알아듣게 쓰란 말이오!!! 캬오!!!!
ㅜ_ㅜ