RTX란 무엇인가 시리즈


Ⅰ. 하이브리드 렌더링 파이프라인

저번 글에서 설명했듯, 레이트레이싱은 굉장히 오래 걸리는 작업입니다. RTX 2060을 장착한 제 컴퓨터로 Blender 프로그램을 실행, 레이트레이싱 렌더링을 수행하면 단순한 장면에서도 몇 초가 걸립니다. 그런데 게임에서 60 FPS를 달성하려면 $\frac{1}{60} = 0.01\dot{6}$초 안에 사진 한 장을 만들어 내야만 합니다. RTX 그래픽카드를 이용해도 속도가 너무 느려서 완전한 레이트레이싱으로 게임을 만드는 것은 불가능합니다.

한편, 레이트레이싱을 사용하지 않는 기존의 게임들을 한번 떠올려 봅시다. 레드 데드 리뎀션, 어새신 크리드, gta5 같은 게임들은 레이트레이싱 없이도 굉장히 아름답습니다. 특히 gta5의 자동차 표면과 도로 물웅덩이 반사 효과는 레이트레이싱을 사용하지 않았음에도 불구하고 완벽해 보입니다. 오히려 레이트레이싱을 한다고 해서 뭐가 얼마나 나아질까 의문이 드는 수준이지요.

여기서 한 가지 아이디어가 떠오릅니다. 100% 레이트레이싱만 사용하면 너무 느립니다. 그러니 일단은 전통적인 방식으로 렌더링을 한 뒤, 유리창이나 총기 조준경처럼 정확한 반사가 필요한 일부분에서만 따로 레이트레이싱을 사용하는 것입니다. 이렇게 하면 $0.01\dot{6}$초 안에 한 장을 그리는 것은 꿈이 아닐지도 모릅니다.

실제로 게임 업계에서 사용하는 것이 이 방법입니다. 이를 하이브리드 렌더링 파이프라인 Hybrid Rendering Pipeline이라고 합니다.

hybrid_rendering_pipeline

그림을 보시면 rastercompute라는 단어가 보이는데요. 쉽게 말씀드리자면 이것들이 바로 전통적인 렌더링 방식입니다. 보통은 래스터라이저라고 부르지요.

  • 레이트레이싱을 사용하지 않는 전통적인 렌더링 방식을 래스터라이저라고 부르겠습니다.
  • 레이트레이싱 안 써도 아름다운 부분은 래스터라이저로, 레이트레이싱을 사용했을 때 눈이 많이많이 즐거워진다면 레이트레이싱을 사용하자! 이것이 하이브리드 렌더링 파이프라인의 기본 아이디어입니다.

각 이미지 아래에 전통적 렌더링만 사용하느냐, 혹은 레이트레이싱을 사용할 수도 있느냐가 표기되어 있습니다. 보시면 반사(reflection)나 글로벌 일루미네이션(global illumination) 같은 것들은 래스터라이저로 구현할 수도 있고 레이트레이싱으로 구현할 수도 있네요.

Ⅱ. 래스터라이저의 약점

잘 생각해 보면, 그림자라던가 표면 반사라던가 이런 것들은 레이트레이싱 없이도 구현이 되긴 됩니다.

watch_dogs_2_ocean_reflections

와치독스 2의 스크린샷인데요. 레이트레이싱을 사용하지 않았음에도 불구하고 수면에 건물들이 반사되는 모습이 굉장히 아름답습니다. 그런데 레이트레이싱을 사용하지 않은 반사 효과에는 치명적인 약점이 존재하지요.

!watch_dogs_2_missing_reflections

건물들이 화면 밖으로 나가버리면 반사들도 덩달아 사라져 버린다는 것입니다. 눈에 상당히 거슬리는 문제이지요. 도대체 래스터라이저는 반사를 어떻게 구현하길래 이렇게 신기한 현상이 일어나는지 궁금하지 않으신가요?

레이트레이싱 알려준다 그래 놓고서는 딴 소리만 하고 있으니 이상하게 보일 수도 있겠습니다. 하지만 제 목표는 커다랗습니다. “레이트레이싱은 현실과 비슷한 방법으로 빛의 움직임을 추적하고 래스터라이징은 편법을 사용해 시각 효과를 구현한다.” 이런 단순하기 짝이 없고 실제를 전혀 반영하지 못 하는 지식만을 여러분께 알려 드리고 돌려보낼 수는 없습니다. 제가 여러분께 알려드리고 싶은 진실은 다음과 같습니다.

  1. 레이트레이싱과 래스터라이저 둘 다 광선을 추적한다.
  2. 레이트레이싱은 공간 속 물체들의 형태를 속속들이 알고 있는 반면, 래스터라이저는 물체들에 대한 정보를 극도로 단순화하여 빠른 속도를 달성한다.

지금부터 이 말이 무슨 뜻인지 알아보도록 합시다.

Ⅲ. Position 이미지를 이용한 화면 공간 작업

아까 그림에서 deferred shading이라는 게 있었죠. 이것이 반사, 굴절, 글로벌일루미네이션, 앰비언트 오클루전 같은 고급 그래픽 기술을 구현하는데 기반이 되는 기술입니다.

g_buffer_images

Deferred rendering을 수행하면 이렇게 생긴 이미지들을 생성해 냅니다. 이것들을 G-buffer라고 부르는데요. 게임에서는 물체의 재질(material) 등의 정보를 버퍼에 렌더링 한 뒤 그 정보들을 조합해서 아름다운 장면을 그려냅니다. 뭔가 딱 봐도 복잡하고 괴상해 보이네요. 열화상 카메라 화면을 이해하는 것보다는 훨씬 어려워 보이는군요. 근데 albedo라는 이름이 붙은 그림은 살짝 알 것 같기도 합니다. 조명의 영향을 받지 않는 물체 본연의 색깔을 나타내는 것 같네요.

사실 다른 건 다 필요 없습니다. 여기서 중요한 것은 오직 position입니다.

Position 이미지는 해당 픽셀 위치에 보이는 물체 표면의 점 하나가, 공간 속에서 어느 위치에 있는지에 대한 정보를 담고 있습니다. 무슨 뜻인지 잘 이해가 안 간다면, 픽셀 하나가 가방을 이루는 원자 하나의 위치를 담고 있다고 생각하셔도 됩니다.

이미지에 표현된 색깔이 무슨 의미냐면 다음과 같습니다. Position, 즉 위치는 보통 벡터로 표현되는데요. 한 픽셀이 (0.8, 0.1, 0.2)라는 위치값을 담고 있다면 그것이 그대로 RGB로 해석이 되어 빨간색으로 표현이 되는 것입니다.

Position 이미지를 사용하면 불완전하게나마 주변 공간의 형태를 알 수 있습니다. 형태를 알면 뭘 할 수 있을까요? 광선을 발사해볼 수 있지요!

실제 게임 엔진은 position 이미지 말고 depth 이미지를 사용할 수도 있습니다만. 이 두 이미지는 행렬 한 방이면 상호 변환이 가능합니다. 그러니 이 글에선 단순함을 위해 둘을 같은 것으로 취급하겠습니다.

Ⅳ. 왜 position 이미지를 사용하냐?

공간에 100개 정도의 삼각형이 있을 때 레이트레이싱을 하면 금방 끝납니다. 하지만 수억 개의 삼각형에다 광선을 쏘면 죽도록 오래 걸리지요.

그런데 100개의 삼각형이든 수억 개의 삼각형이든 일단 deferred rending을 수행하여 position 이미지를 만들어 냈다면? 그 position 이미지에다 광선을 발사한다면 수행 시간은 두 경우에서 큰 차이가 없습니다. 복잡한 3차원의 정보를 단순한 2차원으로 압축한 덕분이죠.

그럼 position 이미지를 만들어내는 부분이 부담이 아니냐 생각할 수 있습니다만. 사실 position 이미지는 래스터라이저 렌더링을 수행하면 얻을 수 있는 부산물에 가깝습니다. 왜냐하면 어짜피 3차원 물체에 색깔와 조명을 입히고 2차원 이미지에 그리는 과정에서 position 이미지 생성에 필요한 정보가 모두 나타나기 때문입니다. 컴퓨터가 지불하는 비용은 그저 position 이미지를 저장할 비디오 메모리 공간 뿐입니다.

여러 제반 사항을 고려한 결과 우리는 깨달았습니다. 삼각형 무더기에 광선을 쏘는 대신 position 이미지에 광선을 쏘는 게 더 빠르겠다! 그렇게 하면 물체가 늘어나도 광선 충돌 검사 시간은 크게 늘어나지 않는다!

이것이 화면 공간(screen space) 테크닉의 기본 개념입니다. 화면 공간 반사(screen space reflection), 화면 공간 앰비언트 오클루전(SSAO, screen space ambient occlusion) 같은 용어들을 들어보셨지요? 화면 공간 반사는 position 이미지에다 광선을 발사하여 반사상의 위치와 색깔을 알아내는 기법입니다. 화면 공간 앰비언트 오클루전은 position 이미지에서 광선을 발사하여 근처에 물체가 가까이 붙어 있나 확인, 이에 따라 구석진 곳을 어둡게 만드는 기술입니다. 화면에 그려진 정보만을 이용하기 때문에 이와 같은 이름이 붙은 것입니다.

저 시퍼러둥둥한 이미지에 광선을 발사한다는 건 어찌 보면 참 해괴한 소리입니다. 추후 기회가 된다면 deferred rendering에 대한 글을 쓸 때 제대로 알려드릴까 합니다. 혹시 따로 알아보고 싶으신 분들은 ray march로 검색해 보시기 바랍니다.

여기서는 기본적인 개념만 알아두고 넘어갑시다.

  • 삼각형 무더기에 광선을 발사하면 너무 오래 걸린다.
  • 3차원 공간의 형태를 2차원 이미지로 표현할 수 있다.
  • 이 이미지 안에서 광선을 발사하면 시간이 훨씬 단축된다.
  • 덕분에 레이트레이싱으로만 가능했던 시각 효과를 훨씬 효율적으로 수행할 수 있게 된다.

Ⅴ. 레스터라이저의 약점으로 인해 생긴 이상한 영상

하지만 그럼에도 우리는 레이트레이싱에 열광합니다. 그 이유는 화면 공간 기법에는 치명적인 약점이 있기 때문이지요. 치명적인 약점이 무엇인지 아까 위에서 와치독스 2의 사례를 통해 확인하셨죠?

반사될 게 보인다/안 보인다 이미지 넣자

Deferred rendering은 카메라에 포착된 부분만 이미지로 만들어 냅니다. 그러므로 카메라 범위 바깥의 공간에 대한 형태나 색깔은 알 수 없습니다. 그래서 반사되어야 할 물체가 화면 밖에 있다면 그 물체는 올바르게 반사되지 못 합니다.

genshin_ssr_occluded

이렇게 캐릭터가 배경을 가린 경우, 배경이 이미지에 포착되지 못하여 반사상에도 나타나지 않습니다. 딱 캐릭터가 가리는 모양대로 반사상이 누락된 모습이 흥미롭습니다.

watch_dogs_boat_reflection_comp

배 지붕에 솟아 있는 물체는 반사가 잘 되다가 일부가 화면 밖으로 나가는 순간 반사상이 잘립니다.

거울이나 자동차처럼 반사상이 화면 밖에 있는 경우가 대부분인 경우 다른 반사 구현 기술을 사용해야만 합니다. 주로 환경맵(environment map) 반사나 평면 반사(planar reflection)를 사용합니다만. 환경맵 반사는 반사상의 모양이 정확하지 않으며 실시간으로 움직이는 물체를 반영하기 어렵습니다. 평면 반사는 장면 전체를 한 번 더 렌더링 해야만 하므로 성능 하락이 너무 커서 최신 게임에선 거의 사용되지 않습니다.

지금까지는 반사상의 예시만 보여드렸는데요. 화면공간 앰비언트 오클루전처럼 화면공간에서 수행되는 모든 작업은 동일한 약점을 갖습니다.

genshin_ssao_hidden

저 멀리 벽의 모서리에 명암이 드리워 있습니다. 저것이 바로 앰비언트 오클루전, 혹은 주변광 차폐이죠. 말 그대로 주변에서 난반사된 빛이 주변에 있는 물체에 막히거나 흡수되어 구석진 곳이 어두워지는 효과를 말하는데요.

캐릭터 옆에 있는 기둥이 벽의 일부를 가리자, 주변광을 차폐해줄 주변 물체가 화면에서 사라져버립니다. 즉, 구석진 곳을 어둡게 만들어줄 주변 물체에 대한 정보를 얻을 수 없게 되는 것입니다. 그래서 그림자가 사라지는 것입니다.

엠비언트 오클루전도 상당히 눈에 안 띄어서 예제를 보여드리기 어려웠는데요. 글로벌 일루미네이션은 더더욱 눈에 잘 안 보입니다. 그러니 여기서 예제를 보여드리긴 어렵겠네요.

Ⅵ. 이 문제를 해결할 수 있는 레이트레이싱

여기까지 오셨다면 바라건데 독자 여러분 모두 래스터라이저가 가진 약점의 근본적 원인에 대해 이해하셨으리라 믿습니다. 화면 공간에서 광선을 발사하기 때문에, 화면에 없는 물체들은 반사될 수도, 빛을 가로막을 수도 없기 때문입니다. 3차원 공간은 2차원 이미지로 압축하면서 정보가 많이 손실되기 때문입니다. 그러니 레이트레이싱이 이 문제를 해결한 방법도 너무나 명확하지요. 2차원 이미지에 광선을 발사하는 것이 아니라, 3차원 공간의 물체 모두에 직접 광선을 발사합니다.

말로 하면 참 간단하지요. 하지만 지난 글에서 알아봤듯, 물체 전체에 광선을 발사하는 것은 굉장히 시간이 많이 걸리는 작업입니다. 그래서 엔비디아는 뛰어난 아이디어를 생각해 냈습니다.

하이브리드 렌더링 파이프라인에 대해 기억하시나요? 보통 물체는 래스터라이저로 렌더링 한 뒤, 반사 등 일부분에서만 레이트레이싱을 사용한다고 하는데요. 레이트레이싱의 양을 많이 줄였다고는 하나 그래도 레이트레이싱이 없을 때보다는 훨씬 느리겠지요.

여기서 엔비디아는 어떤 특별한 방법을 사용했습니다. 바로 래스터라이징와 레이트레이싱을 병렬처리 하여 동시에 수행하는 것입니다. 그렇게 하면 여전히 느리긴 해도 $0.01\dot{6}$초 안에 그림 한 장을 그릴 수 있게 됩니다. 그리고 레이트레이싱에서 핵심적인 작업을 빠르게 수행하는 별도의 하드웨어를 만드는 것입니다. 이 둘을 달성하도록 특별하게 설계된 그래픽카드가 바로 GeForce RTX입니다.

드디어 최종 보스 GeForce RTX 그래픽카드가 등장했네요. 다음 글에서는 GeForce RTX의 자세한 동작 방식에 대해 자세히 알아보도록 하겠습니다.