본문 바로가기

컴퓨터 그래픽스

컴퓨터 그래픽스 - Texturing toward Global Illumination([KUOCW] 한정현 교수님 강의)

이 포스팅은 [KUOCW] 한정현 교수님 강의 16장 - Texturing toward Global Illumination을 듣고 정리한 내용입니다.

 

이전 포스팅했던 phong lighting은 object-wise 조명 효과였습니다. 즉 서로 상호작용하지는 않았다는 것이죠. 하지만 현실 세계에서는 물체 별로 반사 또는 투과가 되기 때문에 서로에게 영향을 끼친다고 할 수 있습니다. 오늘은 그 부분에 대한 설명인 Global Illumination에 대한 포스팅입니다.

2022.01.19 - [컴퓨터 그래픽스] - 컴퓨터 그래픽스 기초 - Fragment Shader part 2. Phong Lighting ([KUOCW] 한정현 교수님 강의)


아래 그림에서 (a)는 각 구체들이 조명에 각각 영향을 받는 모습을 보여줍니다. 하지만 이는 S1이 S2를 가리면서 생기는 그림자에 대해서는 고려하지 않았죠. 하지만 (b)와 같이 빛을 직접적으로 받지 못한다고 검은색으로 처리하는 것 또한 자연스러운 표현 방법은 아닐 것입니다. (c)처럼 S3에서 반사되어 오는 빛을 고려하지 않기 때문이죠. 


 

  • Ray Tracing

위의 그림에서 (c)처럼 Global Illumination를 표현하기위해 고안된 방식이 바로 ray tracing입니다. ray tracing은 view frustum에서 특정 개수의 projection line(ray)가 아래 그림처럼 뻗어 나온다고 가정합니다. 이때 line의 개수는 해상도, 즉 pixel의 수와 동일합니다. 이 카메라에서 나오는 빛을 primary ray라고 하고 이 빛을 통해 pixel의 색상이 정해지는 것이죠. 

projection lines

이렇게 뻗어나오는 빛에 물체를 만났을 때는 shadow ray, reflection ray, transmitted/refraction ray 이렇게 3가지 요소로 나누어집니다. 먼저 shadow ray는 물체에 닿은 지점에서 광원으로 향하는 ray입니다. 이 ray가 광원을 향해서 뻗어나가면서 다른 물체를 만나지 않으면 phong lighting을 이용하여 그 지점의 색상을 결정하는 것이고, 다른 물체를 만나지 않으면 가려진 부분임으로 phong lighting으로 계산하지 않습니다. 

secondary ray

두 번째로 reflection ray는 반사되어 나오는 빛입니다. 이 또한 phong model에서의 계산같이 해당 지점의 normal vector가 있으면 입사각과 반사각을 계산할 수 있죠. 그리고 이때 빛이 반사되는 정도는 물체의 reflectance coefficient m_s에 의해 결정되죠. 이때 계산되는 방향은 phong model와 반대입니다. 이는 카메라에서 뻗어 나온 ray는 빛을 쏘는 입장이 아니라 받는 입장에서 반대로 계산하고 있기 때문이죠. 즉, reflection ray는 반사하는 빛이 아니라 다른 물체가 반사해서 나오는 빛을 받기 위한 것입니다. 

 

마지막으로 transmitted/refraction ray는 물체를 투과해서 오는 빛을 계산하기 위함입니다. 물체가 반투명하면 빛이 그 물체를 통과하게 되는데 이때 그 지점으로 들어오는 빛을 계산하기 위함이죠. 이떄 투과되는 정도는 물체에 따른 transmission coefficient로 결정됩니다. 투과되면서 생기는 굴곡의 방향은 Snell's law를 이용하여 그 물체가 가지고 있는 밀도(?) 차로 빛이 얼마나 굴곡되는지를 결정합니다.

 

이렇게 처음 카메라로부터 나온 primary ray는 물체에 닿아 secondary ray가 되는데 이 ray들 중 reflection ray와 transmitted/refraction ray가 다시 primary ray가 되어 recursive하게 반복됩니다. 이렇게 여러 물체에 반사되거나 투과되는 빛들을 다 계산하는 것이죠. 이때 아래 그림같이 tree 구조로 recursive 하게 반복되는 ray들을 특정 level까지만 연산하도록 제한을 둡니다.

 

recursive하게 뻗어나가는 ray들

이런 방식으로 계산하게 되면 Global Illumination를 고려하기 때문에 보다 사실적인 이미지를 표현할 수 있다고 말합니다. 아래 사진은 ray tracing을 이용하여 만들어낸 결과물인데 매우 사실적으로 표현된 것을 알 수 있죠. 하지만 막대한 연산량이 요구되어 못쓰이다가 RTX 같은 ray tracing을 지원하는 그래픽카드가 나오면서 점점 상용화되고 있는 추세라고 강의에서는 설명합니다.

ray tracing의 결과물


 

  • Environment Mapping

앞서 말씀드렸듯 ray tracing은 막대한 계산량이 요구되는 작업입니다. 이를 극복하기 위해 보다 가벼운 연산으로 사실적으로  표현하기 위해서 나온 방법이 Environment Mapping 입니다. Environment Mapping은 texturing을 통한 반사 표현이라고 할 수 있는데요. 바로 물체가 보는 지점뿐만 아니라 보이지 않는 지점을 정육각형으로 나누어 texture map 형태로 표현하는 것이죠.

Environment Mapping

이렇게 하는 이유는 반사하는 물체는 카메라가 보여지는 시점뿐만 아니라 카메라 밖에서 있는 물체 또한 반사를 하기 때문입니다. 즉 사각인 부분에 대한 색상 정보도 필요하다는 것이죠. 따라서 위의 그림처럼 모든 방향에 대한 색상 정보를 표현하게 되면 아래 그림과 같이 Cube Mapping이라는 방법을 통해 반사되어 들어오는 빛에 대한 계산이 정확하지는 않지만 표현할 수 있게 되는 것이죠. 이때 Cube Mapping 에서는 recursive 하게 무한이 반사되지 않고 단 한 번만 반사되기 때문에 보다 가벼운 계산을 요구합니다. 

Cube Mapping

이런 Environmnet mapping방식을 통해서 나온 결과는 아래 그림과 같습니다. 다만 주전자의 코가 주전자의 몸통에 비추는 효과는 주지 못함을 알 수 있죠. 이러한 한계점이 명확한 알고리즘이지만 눈에 보이는 효과가 있는 알고리즘임은 알 수 있죠.

Environmnet mapping을 이용한 결과


 

  • 그 외

교수님께서는 이번 강의는 위의 내용만 설명하셔서 저도 여기까지만 포스팅 하려고 합니다.

하지만 위의 내용 말고도 강의 자료에는 더 많은 내용이 있어 언급하고 포스팅을 마치려고 합니다.

 

Cube Mapping에 대한 코드 설명

Light Mapping

Ambient Occlusion


이번 강으로 [KUOCW]에서 한정현 교수님께서 강의는 마무리 됩니다. 한정현 교수님께서 정말 잘 가르쳐 주셔서 이렇게 포스팅하게 되는 거 같습니다. 감사드립니다. 하지만 강의 자료에는 아직 나가지 못한 주제들이 있으니 참고 바랍니다. 저도 시간이 된다면 공부해보고 싶네요.

 

아무쪼록 이글 보시는 분들이 도움이 되셨음 좋겠습니다.

감사합니다.

 

References

강의: [KUOCW] 한정현 교수님 강의

https://www.youtube.com/channel/UCfyXTCv0QlZxG1S1rteGI7A

강의 자료: 한정현 교수님 연구실 홈페이지
http://media.korea.ac.kr/books/