Interactive 3D Rendering

상호작용하는 렌더링에 대한 핵심 아이디어.

재생률과 FPS(Frame Per Sceond)

우리가 컴퓨터 화면에서 상호작용을 할 때 렌더링 응답이 느리다는 느낌없으려면 최소 몇 fps여야 할까? 6fps이다. 물론 사람마다 다를것이다.

사실 비디오 게임은 최소 30fps이거나 60fps까지 된다. 이 30fps, 60fps는 임의적인 수치가 아니고 하드웨어에 따라 결정된 것이다.

미국내 대부분의 TV가 60Hz인데 이는 1초에 이미지를 60번 표시함을 의미한다. 이를 재생률(Refresh Rate)이라고 한다.

60hz 모니터가 1초에 60번 이미지를 표시(갱신)할 수 있으므로 애플리케이션이 1초에 60개 이상의 프레임을 표시하려고 할 때 반영되되지 못하는 프레임이 있을 수 있다.
그래서 하드웨어의 재생률이 FPS의 상한이 된다.

애플리케이션이 1920 * 1200 화면에 60fps로 동작할 때 1초에 계산해야하는 픽셀의 총량은 1920 * 1200 * 60 = 138240000 이다.

핀홀 카메라와 눈

핀홀 카마메라는 박스 뒷면에 필름이 있고 앞면에 구멍이 뚫려있다. 이 구멍을 핀홀이라고 한다. 핀홀을 빛에 노출시키면 박스 뒷면 필름에 위 아래 거꾸로 이미지가 형성된다.

단순화 하면 우리의 눈도 이와 같이 작동한다. 하지만 뇌는 이미지 정보를 해석해 위 아래가 올바른 모습으로 인식한다.

뷰 프러스텀

핀홀 카메라가 위 아래를 거꾸로 이미지를 형성하지만 컴퓨터 그래픽에서는 조금 다르게 위 아래가 올 바르게 물체의 이미지를 물체와 뷰어 사이에 스크린에 형성한다.

사각의 스크린에 투사되는 세계관(view of world)을 뷰 프러스텀(view frustum)이라고 한다. 프러스텀이란 피라미드 윗 꼭지 부분을 평행면이 되도록 절단한 모양이다.

view frustum. image from https://wikipedia.org

빛은 광자(photon)들을 뿜어내고 이 광자들은 물체의 표면에서 산란되거나 흡수된다. 이 광자들을 받은 카메라에선 필름에 이미지가 형성된다.

컴퓨터 그래픽에서도 실세계를 최대한 흉내내어 각 방향에서 얼마나 많은 광자들이 모이는가를 측정하고 이를 스크린에 투사한다.

한 방향에서 모인 빛의 양이 얼마되든간에 스크린의 한 픽셀로 기록한다. (어떤 한 픽셀은 어떤 한 방향으로 모인 광자들을 반영한다고 볼 수 있을거 같다..)

방충망으로 생각해보자.
우리 눈앞에 방충망있고 방충망 너머의 세상을 바라본다면, 방충망의 각각 작은 사각 영역들은 컴퓨터 그래픽스에선 뷰 프러스텀이 투사된 스크린의 각각의 픽셀들로 비유할 수 있을거 같다.

빛과 렌더링

이미지를 형성하기 위해 얼마만큼의 빛이 픽셀로 도달하는가를 측정하는 방법은 얼마든지 있다.

이론적으로 장면(scene)의 광자 전체를 시뮬레이트할 수도 있다.
광원으로 부터 뿜어나온 광자가 물체 표면에 부딛히고, 반사되고, 흡수되는 등의 과정을 말이다.

이때 광원을 40W의 전구로 사용하게 된다면 대충 계산해도 1초에 10개에서 19개의 광자를 방출하는데 이를 모든 물체 표면에 대하여 계산해야 한다.
하지만 이런 비싼 비용으로 시뮬레이트된 광자들 중 결국 카메라에 들어오는 광자의 수는 전체 광자 수에 비하면 매우 적다.

이러한 비싼 비용의 계산을 피하기 위해 몇가지의 단순화한 가정을 가지고 접근한다.

  • 카메라로 들어오는 광자만이 이미지 형성에 필요한 광자다.
  • 물체 표면이 광원에 직면하고 있다면 빛은 표면에 도달할 것이고 표면은 그림자가 지거나 가려지지 않는다.

위의 가정을 토대로 광자가 광원에서 뿜어져 나오고 물체에 부딛혀 카메라에 도달하는 과정의 처리를 역으로 한다.

ray tracing. image from https://wikipedia.org

처음에 우리는 물체의 위치, 크기, 색깔를 알고있지만 아직 광자를 계산하지 않았기 때문에 평면으로 보일것이다.
카메라로부터 픽셀에 해당하는 방향으로 선을 쏜다(ray casting).
선이 도달한 물체의 표면에서 광원의 직접적 영향을 계산하여 물체 명암의 합리적 근사치를 얻을 수 있다.

유타 티팟

utah teapot. image from https://wikipedia.org

마틴 뉴웰(Martin Newell)이 만든 모델이다. 마틴 뉴웰은 렌더링을 위한 Patnter's Algorithm을 공동 개발했으며 컴퓨터 그래픽스의 선구자 중 한 사람이다.

과거에는 렌더링하기 적당히 간단한 수학적 모델이 많이 없었다. 하루는 뉴웰이 그 문제를 부인과 차를 마시며 얘기했는데 부인이 다기 세트를 모델링 해볼것을 제안했다.

이 모델은 렌더링하기에 좋은 여러 요소를 가지고 있기 때문에 컴퓨터 그래픽스에서 상징적인 3D 모델이 되었다.

참고하면 좋은 Bézier Curves and Surfaces: the Utah Teapot

Pipeline

물체가 GPU로 렌더링되는 과정을 높은 단계에서 추상화해보자.

rendering pipeline

  1. 애플리케이션은 물체를 삼각형으로 변환시킨다.

  2. 모델 변형(model transform)과 함께 카메라의 관점으로 모델이 조정된다

  3. 래스터화 한다.

모델 변형이란 위치, 방향 그리고 부분크기 등을 조정하는 방법이다. 예를 들어 튀는 공을 렌더링할 때 각 프레임마다 공의 모델 변형은 공을 다른 위치로 옮길 것이다.

카메라의 관점이란 뷰 프러스텀이다. 뷰 프러스텀 내부의 물체만 이미지에 반영된다.(밖의 물체는 'clipped:잘림'된다.)

모델변형은 각 삼각형의 위치를 계산하며 만약 세 점의 삼각형이 일부 혹은 전부가 프러스텀 안에 있으면 래스터화(rasterization) 처리를 한다.만약 삼각형이 뷰 프러스텀에서 일부가 잘리면 다시 몇개의 삼각형로 바꾼다.

래스터화는 삼각형들을 스크린의 픽셀로 바꾼다

results matching ""

    No results matching ""