2013년 7월 8일 월요일

3D Basic Lesson 1-2. 간단히 설명하는 레이트레이싱




몇 주 전 Scratchapixel쪽에 강좌를 한글로 번역해도 좋냐는 메일을 보냈고, 대략 다음과 같은 내용의 답변을 받았다.


스크래치는 앞으로 여러 언어로 서비스할 계획에 있지만, 현재로써는 예산의 한계때문에 그러지 못하고 있습니다. 스크래치가 다국어 서비스를 시작하기 전까지는 번역본을 블로그에 게재하셔도 좋습니다.

막상 허락은 받아 놨는데 내가 이걸 번역할 근성이 될 지... 일단은 일주일에 한 챕터씩 하는걸로. 되는데까지는 해보자.

-----


다음은 Scratchapixel 의 글 중 [3D Basic Lessons - Lesson 1 : Writing a Simple Raytracer] 중 '2. Raytracing Algorithm in a Nutshell' 을 번역한 것입니다.

원문 : http://www.scratchapixel.com/lessons/3d-basic-lessons/lesson-1-writing-a-simple-raytracer/raytracing-algorithm-in-a-nutshell/


이전 강좌 : 3D Basic Lesson 1-1. 어떻게 동작하나요?

Lesson 1-2. 간단히 설명하는 레이트레이싱 


우리가 왜 물체를 볼 수 있는지는 Ibn al-Haytham이 설명했습니다. 그의 발견에는 두 가지 흥미로운 점이 있습니다. 첫째로 우리는 빛이 없이는 아무것도 볼 수 없고, 둘재로 주위에 물체가 없으면 우리는 빛을 볼 수 없습니다. 우리가 은하계 사이를 여행한다면 그런 일이 평범하게 일어나곤 하겠지요. 만일 우리 주위에 어떠한 물질도 존재하지 않는다면 우리는 광자들이 그 공간을 돌아다니고 있다 하더라도 암흑 외에는 그 어떤것도 볼 수 없게 됩니다.

정방향 추적Forward Tracing


그림 4: 광원에서 나온 무수히 많은 광자들이 초록색 구를 때리지만, 단 하나만이 눈의 표면에 닿는다.

컴퓨터로 생성한 이미지에서 빛과 물체 사이의 상호작용을 시뮬레이션하고 싶다면 우리가 알아야 할 것이 하나 더 있습니다. 물체에 의해 반사된 광선의 수에 비해,  한정된 몇 개의 광선만이 눈의 표면에 들어온다는 것입니다. 여기 그 예가 있습니다. 한번에 한개의 광자만을 발산하는 광원이 있다고 상상해봅시다. 광원에서 나온 광자는 어떤 물체에 닿을 때까지 직선으로 나아갈 것입니다. 광자의 흡수를 고려하지 않는다면, 물체에 닿은 광자가 어떤 임의의 방향으로 반사될 것이라고 생각할 수 있습니다. 반사된 광자가 우리의 눈 표면에 도달하면 우리는 광자가 반사되었던 바로 그 지점을 "보는" 것입니다.



 독자로부터의 질문: 위에서 "빛이 비춰지는 영역의 각 점이나 물체가 광선을 모든 방향으로 방사 (반사) 한다." 고 하셨는데요, 이건 "어떤 임의의 방향" 이라는 말과는 배치되는 것 아닌가요?
 답변: 왜 빛이 모든 방향으로 반사되는지 설명하는 것은 이번 레슨의 주제와는 조금 맞지 않는 것 같습니다 (완전한 설명을 위해 빛-물체간의 상호작용에 관한 레슨을 보세요). 그래도 짧게 답변드리자면, 맞습니다. 또한 아닙니다. 물론 실제 세계에서 표면에 반사된 광자는 위상기하학과 광자가 입사되는 방향에 따라 정의된 어떤 특정한 방향으로 나아갑니다. 우리 눈에 난반사 물체의 표면은 부드럽게 보이는데, 현미경으로 보면 그 미세 구조는 매우 복잡하고, 전혀 부드럽지 않습니다. 왼쪽의 사진은  다른 배율들로 촬영한 종이의 표면입니다. 광자들은 너무나 작아서 우리 눈에  보이지 않는 이 복잡한 구조에 따라 반사됩니다. 광선의 다발이 이 난반사 물체의 표면을 비추면, 광자들이 복잡한 구조의 서로 다른 부분들에 닿아 여러 방향으로 반사되는 것입니다. 그 방향이 너무나 많기 때문에 우리가 "가능한 모든 방향" 이라고 한 것입니다. 이러한 이유로 광자들과  이러한 미시 구조와의 상호작용을 시뮬레이션하기 위해 광선들을 임의의 방향으로 균등하게 반사시켜도 실제와 크게 다르지 않게 됩니다.
가끔 거시적 크기 (눈에 보이는 정도의 크기) 에서 이러한 구조를 가지고 있는 물체는 빛을 특정한 방향으로 반사하기도 합니다. 이것은 비등방성anisotropic 반사라고 하며 빛-물체간 상호작용을 다룬 레슨에서 자세히 다뤄질 것입니다. 이러한 거시적 구조는 나비의 날개에서 볼 수 있는 무지개 빛을 만드는 원인이 되기도 합니다. 




이러한 현상을 컴퓨터 그래픽스의 관점으로 바라봅시다. 먼저, 눈을 픽셀들로 구성된 이미지 평면으로 대체할 수 있습니다. 이 경우에는 발산된 광자들이 이미지 평면 위의 픽셀들 중 하나에 닿으면서 그 지점의 밝기를 0보다 큰 값으로 증가시킵니다. CG 이미지는 이 과정을 모든 픽셀들의 밝기(또는 색상) 이 조절될 때까지 반복하는 방법으로 생성할 수 있습니다. 이 기술은 전반향 광선 추적forward ray-tracing 이라고 불리는데 그 이유는 광원에서 관측자 방향으로 앞으로 나아가며 광선을 추적하기 때문입니다.

이 방법에 어떤 문제가 있는지 보이시나요?

문제는 다음과 같습니다: 우리는 반사된 광자가 항상 눈으로 들어온다고 가정했습니다. 실제로는 광선들이 가능한 모든 방향으로 반사되기 때문에 그 중 어느 광선이 눈으로 들어올 확률은 매우 적습니다. 눈에 들어오는 하나의 광자를 찾기 위해서는 엄청난 양의 광선을 쏘아야 합니다. 실제 세상에서는 이렇게 셀 수 없이 많은 광자들이 빛의 속도로 모든 방향을 향해 여행하고 있는 것입니다.

이제 이렇게 생각하실지도 모르겠네요. "정말로 광자들을 임의의 방향으로 쏘아야 하는 건가요? 눈의 위치를 알고 있으니까 그 방향으로 광자를 쏘고, 그 중 이미지 평면을 지나는 것이 있다면 그것이 어느 픽셀을 지나는지 보면 되는 거 아닌가요?" 이것은 확실히 가능한 최적화 방법 중 하나이지만, 특정한 재질에만 쓰일 수 있습니다. 나중에 빛-물체간 상호작용에 대한 레슨에서 설명하겠지만 난반사 표면에서 방향성은 중요하지 않습니다. 이것은 난반사 표면에 도달한 광자는 부딪힌 부분의 normal (역주: 구의 중심으로부터 표면의 한 점을 향하는 벡터) 을 축으로 하는 반구의 어느 방향으로나 반사될 수 있기 때문입니다. 그런데 표면이 거울이고 난반사 속성이 없다면, 광선은 하나의 정확한 방향으로만 반사될 것입니다; 거울 반사 방향입니다 (나중에 이를 어떻게 계산하는지 배울 것입니다). 이러한 종류의 표면을 계산하기 위해, 거울 반사가 일어나는 경우에는 광자의 방향을 인위적으로 바꿔서는 안 되는 것입니다. 곧 이 방법이 완전히 만족스러운 건 아니라는 뜻이지요.

독자로부터의 질문: "눈은 점으로 된 광수용기인가요? 아니면 면적이 있는 표면으로 된 광수용기인가요? 광자를 수용하는 표면의 면적이 매우 작다 하더라도 여전히 그 영역이 점보다는 클 텐데, 그렇다면 그 표면은 단 한 개의 광선이 아니라 더 많은 광선을 수용하게 되는 것 아닌가요?"
답변: 정확합니다. 눈은 카메라의 필름이나 전하 결합 소자CCD처럼 점이 아니라 면적이 있는 표면으로 된 광수용기입니다. 이 레슨은 레이트레이싱 알고리즘을 소개하는 레슨이므로 이 주제를 지금 자세히 설명하기는 조금 어렵습니다. 카메라와 사람 눈 모두 들어온 광선들을 그 표면의 뒷부분으로 모아주는 (초점을 맞추는) 렌즈를 가지고 있습니다. 만일 렌즈의 반지름이 매우 작다면 (광수용기가 점에 가깝다면) 기술적으로 물체로부터 반사된 빛이 한 방향에서만 온다고 생각할 수 있습니다. 이것이 바늘구멍 카메라pinhole camera가 동작하는 방식입니다. 나중에 카메라에 대한 레슨에서 이 주제에 대해 더 이야기할 것입니다.

이러한 방법을 사용하여 난반사 물체만 그리기로 결정했다 하더라도 아직 한 가지 문제가 남아 있습니다. 우리는 광원으로부터 화면에 광자를 쏘는 과정을 광선 (혹은 작은 페인트 입자) 들을 물체 표면에 뿌리는 것으로 생각할 수 있는데, 충분히 촘촘하게 뿌려지지 않는다면 어떤 부분은 보이지 않는 채로 남게 될 것입니다.

검은 종이 위에 흰색 펜으로 점을 찍어 주전자를 그리려 한다고 생각해 봅시다 (각각의 점이 광자를 의미합니다). 아래 그림에서 보이듯 주전자와 충돌하는 광자들의 수가 적으면 나타나지 않은 부분이 대부분입니다. 계속 점을 찍어 나가면, 주전자가 광자들로 "거의 완전히" 덮여 물체를 쉽게 알아볼 수 있을 때까지 광자들의 밀도가 증가합니다.



하지만 1000개나 그 몇 배의 광자를 쏘더라도, 우리는 물체의 표면이 완전히 광자들로 덮일 것이라고 확신할 수 없습니다. 이것이 이 방식의 주요한 문제점입니다. 다시 말해서, 물체가 적절히 표현되기 위한 충분한 수의 광자들이 발사되었다고 판단될 때 까지 프로그램을 실행시켜야 한다는 말입니다. 이는 우리가 실행을 멈출 시점을 결정하기 위해 물체가 그려지는 모습을 관찰하고 있어야 한다는 의미입니다. 실제 제작 환경에서는 불가능한 일입니다. 게다가 레이트레이싱에서 가장 연산비용이 많이 드는 작업은 광선과 지형지물의 교차지점을 찾는 것인데, 광원으로부터 많은 수의 광자를 내보내는 것 까지는 크게 상관이 없을지라도, 그것들의 모든 교차지점을 찾는 것은 허용할 수 없을만큼 비용이 클 것입니다.

결론: 원칙적으로 정방향 광선추적forward ray-tracing (또는 광원으로부터 빛을 쏘기 때문에 광 추적light tracing이라고도 합니다) 을 사용하면 자연에서 빛이 운동하는 과정을 시뮬레이션 할 수 있습니다. 하지만, 이 방법은 지금까지 얘기한 것 처럼 효과적이거나 실용적이지 못합니다.


역방향 추적Backward Tracing

그림 5: 역방향 광선추적backward ray-tracing. 눈에서부터 구의 한 지점까지 광선을 추적하고, 다시 그 지점에서 광원까지 광선을 추적한다.

광원으로부터 광수용기 (우리의 눈 같은 것 말입니다) 를 향해 광선을 추적하는 대신에, 수용기로부터 물체를 향해 거꾸로 광선을 추적합니다. 실제로 일어나는 것과 방향이 반대이므로 역방향 광선 추적backward ray-tracing 이라고 불리거나, 눈에서부터 광선을 발사하므로  눈 추적eye tracing 이라고도 불립니다 (그림 5). 이 방법은 전방향 광선 추적forward ray-tracing의 결점에 대해 편리한 해법을 제시합니다. 시뮬레이션이 자연의 것처럼 빠르고 완벽할 수는 없으므로, 우리는 타협하여 눈에서 장면scene을 향하는 방향으로 빛을 추적해야 합니다. 만일 광선이 물체에 닿는다면 또 다른 광선 (빛 광선light ray라고 불리는) 을 발생시켜 그 부분이 얼마나 많은 빛을 받게 되는지를 알아볼 수 있습니다. 때때로 이 "빛 광선light ray"는 장면의 다른 물체로부터 가로막히게 되는데, 이것은 처음 빛이 물체에 닿은 부분이 그림자 안에 있다는 것을 의미합니다 (곧 그 부분은 광원으로부터 어떠한 빛도 받지 않는다는 뜻입니다) . 이러한 이유로 우리는 이 광선들을 빛 광선light ray 가 아니라 그림자 광선shadow ray 이라고 부를 것입니다. 컴퓨터 그래픽 분야에서는 우리가 눈에서부터 장면을 향해 쏜 첫 광선을 일차 광선primary ray, 시계 광선visibility ray, 또는 카메라 광선camera ray 이라고 부릅니다.

이 레슨에서 우리는 광선이 광원에서 발산하는 상황을 전방향 추적forward tracing, 반대로 카메라에서 광선이 발사되는 상황을 역방향 추적backwrad tracing이라고 하였습니다. 하지만 어떤 사람들은 이를 반대로 사용하기도 합니다. 카메라에서 광선을 쏘는 것이 컴퓨터 그래픽스에서 가장 일반적인 경로 추적 기술이기 때문에 이것이 전방향 추적forward tracing이라고 불리기도 합니다. 혼란을 막기 위해 조금 더 명시적인 광 추적light tracing 이나 눈 추적eye tracing 같은 용어를 사용하실 수도 있습니다. 이러한 용어는 양방향 경로 추적에서 더 자주 사용됩니다 (고급 과정을 보세요).

결론

눈에서 시작하던 광원에서 시작하던, 컴퓨터 그래픽스에서는 광선을 발사하는 이미지 생성 방식을 경로 추적path tracing 이라고 부릅니다. 광선 추적ray-tracing이라는 용어도 사용될 수 있지만 어쨌거나 경로 추적path tracing이라는 용어의 개념은 광원으로부터 카메라를 향해 (혹은 그 반대로) 경로를 추적하는 방식을 사용한다는 데 있습니다. 여기에 물리법칙을 현실적으로 적용하면, caustics*나 간접 조명indirect illumination (장면 내의 다른 물체로부터 반사된 빛을 반영하는 효과) 같은 광학 효과를 쉽게 시뮬레이션 할 수 있습니다. 다른 레슨에서 이러한 주제를 다룰 것입니다. 



*(역주) caustics : 그림을 보시면 이해가 빠르실 겁니다.
출처 위키피디아

댓글 없음:

댓글 쓰기