Priv's Blog

비주얼 렌더링 시스템 본문

Dev. Study Note/VR Introduction

비주얼 렌더링 시스템

Priv 2025. 1. 15. 16:21


 

 

1. 비주얼 렌더링 기법

1.1. 오브젝트 기반 렌더링

시각 이미지를 렌더링 하기 위해서는 가상의 객체(오브젝트)를 어떤 방식으로 렌더링 할 것인지를 결정해야 한다.

시각 디스플레이는 픽셀 단위로 구성되어 있다.

픽셀 하나는 하나의 빛을 낼 수 있는 가장 작은 단위로, 이 픽셀의 수가 많고, 밀도가 높을수록 더 미세한 표현이 가능해진다.

오브젝트 기반 렌더링 기법은 오브젝트 정보를 벡터 기반의 수학적 데이터로 연산하여 렌더링 하는 기법이다.

객체의 폴리곤, 선, 곡선 등의 수학적 데이터를 알고리즘으로 계산하는 방식이기 때문에 화면의 픽셀 단위와 무관하게 렌더링 할 수 있다.

3D 그래픽 분야에서는 CAD가 대표적인 오브젝트 기반 렌더링 기법을 사용하고 있으며, 2D 그래픽 분야에서는 Adobe 사의 illustrator가 대표적이다.

이는 다시 말해서 오브젝트에 대한 모든 데이터를 기하학적 데이터로 연산해야 한다는 것을 의미하기 때문에 복잡도가 증가하면 그만큼 연산 비용도 커진다는 것을 의미한다.

이 때문에 오브젝트 기반 렌더링 기법은 게임처럼 실시간 렌더링 성능이 중요한 분야보다는 청사진과 같이 정적인 분야에서 주로 활용된다.

 

1.2. 픽셀 기반 렌더링

픽셀 기반 렌더링 기법은 오브젝트 기반 렌더링 기법과 비교했을 때 알고리즘이 '뒤집히는' 형태를 띤다.

즉, 화면의 개별 픽셀에 기반하여 가상의 객체를 렌더링 하는 것이다.

디스플레이의 픽셀에 표시해야 할 이미지의 부분이 무엇인지를 기준으로 연산을 처리하므로, GPU의 병렬 처리 성능이 렌더링 분야에서 빛을 발할 수 있는 이유가 되기도 한다.

디스플레이의 픽셀 수가 많아지면 당연히 렌더링 데이터와 연산량이 증가하며, 수학적인 계산을 통해서 렌더링 되는 방식이 아니므로 기하학적 정확도는 상대적으로 낮은 편이다.

근래에 들어서 많은 주목을 받은 그래픽 기술 중 하나인 '레이 트레이싱' 기법도 픽셀 기반 렌더링 기법 중 하나였다.

이 기법은 디스플레이의 픽셀 하나하나에서 광선을 투사하여 그 광선의 반사와 굴절을 계산하는 방식으로 사실적인 광원 효과를 재현하는 기법이다.

매우 현실적인 광원 효과를 구현할 수 있으나 기본적으로 디스플레이의 픽셀 수가 워낙에 많다 보니(FHD 기준 1920 * 1080 == 2,073,600개의 픽셀) 해상도가 조금만 올라가도 연산량이 기하급수적으로 늘어난다는 치명적인 단점이 발목을 잡고 있다.

 

1.3. 래스터화 / 래스터라이제이션 (Rasterization)

시각 이미지 렌더링에서 기본적으로 사용되는 알고리즘은 씬 안에 있는 오브젝트 목록을 순회하며 각 오브젝트가 보이는지를 판단한 뒤, 화면에 보이는 오브젝트가 얼마나 많은 픽셀을 차지하는지를 결정하는 것이다.

그 후에는 오브젝트가 차지하고 있는 픽셀들이 카메라로부터 얼마나 떨어져 있는지를 파악하고, 각 픽셀에 어떤 효과(조명, 텍스처 등)와 적용될 것인지를 계산하게 된다.

이렇게 계산된 결과물은 출력 버퍼의 2차원 배열인 '래스터(Raster)'에 저장된다.

이처럼 출력 버퍼 래스터에 렌더링 결과물 값을 저장하는 작업을 '래스터화' 또는 '래스터라이제이션'이라고 부른다.

이처럼 래스터화 작업은 픽셀을 기준으로 진행되기 때문에 픽셀 기반 렌더링 기법을 사용하게 된다면 그만큼 소모되는 비용이 자연스럽게 증가하게 된다.

추가적으로 래스터화는 뷰의 서로 다른 영역에 각기 다른 수준의 연산을 적용할 수 있다.

이 덕분에 렌즈 왜곡 보정, 시선 추적, 포비티드 렌더링과 같은 기술을 지원할 때 특히 유용하다.

 

1.4. 기하학적 표현 기반 렌더링

기하학적 표현 기반 렌더링 방식에는 다음과 같은 종류가 있다.

- 폴리곤(Polygonal)

- NURBS(Non-Uniform Rational B-Splines)

- CSG(Constructive Solid Geometry)

 

1.4.1. 폴리곤 방식

폴리곤 방식은 가장 기본적이고 보편적인 기하학적 표현 기반 렌더링 방식이다.

NURBS 방식과 CSG 방식으로 표현된 데이터도 일부 손실은 발생하겠지만 포맷을 변환하여 폴리곤 방식으로 표현하는 것도 가능하다.

대부분의 렌더링 하드웨어는 다각형(폴리곤) 중에서 가장 단순한 형태인 삼각형에 기반한 래스터라이제이션 프로세스에 최적화되어 있다.

즉, 복잡한 다각형으로 구성된 오브젝트를 가장 단순한 형태인 삼각형으로 잘게 쪼개서 수없이 많은 삼각형들이 픽셀을 기준으로 어디에 위치하는지, 어떻게 보이는지를 계산한 정보를 래스터에 저장하는 방식을 사용한다.

굳이 삼각형을 사용하는 이유는 다각형 중에서 가장 적은 데이터로 표현할 수 있는 다각형이기 때문이다.

또한 모든 복잡한 기하학은 삼각형으로 분할이 가능하므로, 하드웨어 가속 및 효율적인 연산 작업에 적합하다.

그래픽 하드웨어에서 직접 구동되는 프로그램인 셰이더 코드(Shader Code)는 다른 방식으로 표현된 데이터를 실시간으로 픽셀 사이즈에 맞는 폴리곤 조각들(fragments)로 변환하는 역할을 한다.

 

1.4.2. NURBS 방식

NURBS 방식은 자동차처럼 곡선이 많은 오브젝트를 표현할 때 유리한 방식이다.

곡면을 표현하기 위해 NURBS 방식도 수학적 계산 방식을 활용하며, '제어점(Control Points)'라고 불리는 매개변수를 사용한다.

이 제어점 방식은 Adobe 사의 illurstrator 프로그램에서 '핸들'을 이용해 곡선을 표현하는 방식을 떠올리면 쉽게 이해할 수 있다.

오브젝트의 표현에 설정된 제어점을 끌고, 당기고, 회전시키면, 그 제어점이 위치한 좌표에서 사물의 표면을 '잡아당기는' 것처럼 곡률을 적용하는 것이다.

 

1.4.3. CSG 방식

CSG 방식은 기본 3D 도형(구, 정육면체, 원통 등)들을 더하고 빼는 방식으로 오브젝트를 형성하는 방식이다.

가장 단순한 형태의 4인용 식탁을 떠올려보자.

이 식탁은 다리 4개와 상판 1개로 구성되어 있으므로 총 5개의 직육면체로 만들어질 것이다.

여기에 목공예 작가들이 작업하는 것처럼 도넛 모양의 구멍을 뚫어준다면 좀 더 매력적인 테이블 디자인이 만들어질 것이다.

위 사진처럼 CSG 방식을 사용하면 다양한 굴곡을 지닌 오브젝트도 쉽게 구현할 수 있다.

다만 저렇게 생성된 오브젝트의 퀄리티를 높이기 위해서는 결국 요구되는 수많은 삼각형의 수가 늘어나게 된다.

즉, 보다 높은 퀄리티의 오브젝트 렌더링을 위해서는 삼각형으로 빈틈없이 표면적을 채우는 테셀레이션(tessellation) 수준을 올려야 하므로 그만큼 렌더링 비용도 함께 올라가게 된다.

 

1.5. 비기하학적 표현 기반 렌더링

앞서 살펴본 기하학적 표현 기반 렌더링 기법은 '표면 기반 렌더링 기법'이라고도 불린다.

즉, 오브젝트의 외형(표면)을 기반으로 하여 렌더링 한다는 것이다.

이 때문에 투명/반투명한 오브젝트(안개, X-Ray 등)는 기하학적 표현 기반 렌더링 기법으로는 표현이 어렵다.

이러한 경우에 비기하학적 표현 기반 렌더링 기법이 사용될 수 있는데, '볼류메트릭 시스템(Volumetric System)'과 '파티클 시스템(Particle System)'이 대표적인 비기하학적 표현 기반 렌더링에 해당한다.

 

1.5.1. 볼륨 렌더링 (Volume Rendering)

볼륨 렌더링은 일반적으로 레이 트레이싱(Ray-Tracing) 방식으로 구현된다.

앞서 언급한 바와 같이 픽셀의 위치에서 발사된 광선(Ray)은 광학 분야에서 정의하는 물리 법칙에 근거하여 진행, 굴절, 반사된다.

 

1.5.2. 파티클 및 점 기반 렌더링 (Particle and Point-Based Rendering)

파티클 및 점 기반 렌더링은 하나의 점과 같은 '입자'를 렌더링 하기 위해 사용된다.

수없이 많고 작은 입자(Particle)들이 주변 환경의 대기 흐름 등에 영향을 받으며 움직이는 현상을 렌더링 하여 시각적으로 보여주는 것이다.

화재, 연기, 폭발, 안개 등과 같은 현상들을 재현할 때 적합한 렌더링 기법으로, 게임 분야에서는 VFX(시각 특수 효과)를 구현할 때 주로 사용된다.

 

1.5.3. 포인트 클라우드 (Point Clound)

포인트 클라우드는 파티클 렌더링과 유사한 개념인데, 개별적인 데이터 점들이 모여서 하나의 구조를 형성하는 방식이다.

하지만 포인트 클라우드 방식은 파티클 방식과 달리 정적인 특성을 지니고 있으며, 렌더링해야 하는 점의 수가 훨씬 더 많다.

LiDAR 스캐너가 포인트 클라우드 방식을 이용하여 주변 지형 사물을 캡처하는데, 일반적으로 약 수십억 개의 점을 생성할 수 있다.

이 수많은 점들이 모이다 보면 마치 점묘법처럼 하나의 사진처럼 보이기도 한다.


 

포인트 클라우드란 무엇인가요?

포인트 클라우드가 무엇인지, 포인트 클라우드의 용도는 무엇이며 어떻게 작동하는지 알아보세요. 또한 포인트 클라우드를 사용하는 방법도 안내해 드립니다.

www.oxts.com


 

1.6. 복잡한 비주얼 씬 렌더링

복잡한 비주얼 씬을 렌더링 하기 위해서는 다양한 속임수가 필요하다.

복잡하게 구성된 도시나 자연경관과 같은 넓은 영역을 '정직하게' 렌더링 하는 것은 현실적으로 불가능하다.

이 때문에 텍스처 맵, 프로그래밍 가능한 쉐이더, LOD, 컬링, 동적 해상도, 베이킹, 업스케일링 등 다양한 기술들이 동원된다.

 

1.6.1. 래스터라이제이션 렌더링 파이프라인 (렌더링 파이프라인)

렌더링 파이프라인 또는 그래픽 파이프라인은 3차원 이미지를 2차원 래스터 이미지로 표현하기 위한 단계적인 방법을 의미한다.

랜더링 파이프라인은 아래와 같이 세 가지 주요 부분으로 구분된다.

위 단계를 좀 더 상세하게 구분해 보면 다음과 같다.

- 씬 내에 있는 각 오브젝트를 순회

- 주어진 오브젝트의 각 삼각형을 순회

- 삼각형의 버텍스들이 화면 내 공간에서 어디에 위치하는지 파악 (나머지는 클리핑)

- 삼각형 래스터화 (해당 삼각형이 덮는 픽셀 결정): 삼각형 버텍스 간 값을 보간하여 각 픽셀 위치의 속성(색상, 깊이, 표면 노멀, 텍스처 좌표)을 결정

- 속성과 조명 계산을 결합, 각 픽셀의 최종 색상을 계산

- 기존 픽셀 값과 깊이 테스트를 수행하여 새 데이터가 더 가깝다면 값을 교체

- 화면에 결괏값 표시 (디스플레이)

깊이 버퍼를 사용하여 현재 픽셀의 거리 값을 저장하면 소량의 메모리만 가지고 알고리즘 정렬 작업을 효율적으로 처리할 수 있다.

즉, 어떠한 물체를 보이게 할지 말아야 할지를 결정하는 데 사용할 수 있는 정보가 생기는 것이다.

다만 이는 불투명한 삼각형에만 적용(기하학적 표현 기반 렌더링)이 가능하기 때문에 비기하학적 표현 기반 렌더링에는 적용이 어렵다.


 

Z 버퍼링 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. Z 버퍼 데이터 컴퓨터 그래픽스에서 Z 버퍼링(z-buffering)은 3차원 그래픽스의 이미지 심도 좌표 관리 방식이며, 일반적으로는 하드웨어적으로 처리되나 이따금은

ko.wikipedia.org


 

1.6.2. 셰이딩

셰이딩은 3차원 컴퓨터 그래픽스 분야의 렌더링 과정 중 하나로, 가상 세계 속에서 그림자를 처리하는 방법을 다룬다.

가장 단순한 셰이딩 방법론은 삼각형 또는 다각형 단위로 조명을 계산하여 해당 삼각형/다각형 전체를 동일한 색상으로 채워버리는 '플랫 셰이딩(Flat Shading)'이다.

플랫 셰이딩은 간단하게 구현이 가능하고 계산 비용이 적기 때문에 일반적으로 텍스트 렌더링, UI, HUD 등과 같이 평면적인 이미지를 단순하게 표현하고자 할 때 주로 사용한다.

다만 플랫 셰이딩은 삼각형마다 단일 색상이 사용되기 때문에 디테일과 현실감이 부족하다.

특히 서로 다른 색상의 삼각형들을 나열하는 방식이기 때문에 곡면을 연출하기 위해서는 수많은 삼각형이 필요하기 때문에 오히려 비효율적인 방법이 된다.

고러드 셰이딩(Gouraud Shading)은 (현대에는 거의 쓰이지 않지만) 이러한 플랫 쉐이딩의 단점을 보안한 셰이딩이다.

플랫 셰이딩과 달리 삼각형/다각형의 버텍스 단위에서 조명을 계산하고 삼각형 내부 픽셀에 부드럽게 보간하는 방법이다.

이와 유사한 기법으로 퐁 셰이딩(Phong Shading)이라는 기법도 존재한다.

퐁 셰이딩은 표면의 곡선이나 부드러운 조명 효과를 표현하기 위해 픽셀 단위에서 색상을 계산하는 방식의 셰이딩이다.

여기서 언급한 플랫 셰이딩, 고러드 셰이딩, 퐁 셰이딩은 가장 기본적은 셰이딩 기법일 뿐이다.

현대에는 앰비언트 어클루전, 스킨 셰이딩 등 GPU 하드웨어와 API의 발달로 다양한 용도에 맞게 최적화된 셰이딩 기법들이 대거 등장하였다.

 

1.7. 최적화 기법

사실 렌더링 성능을 올리기 위한 최적화라고 한다면 가장 먼저 생각해 볼 수 있는 방법이 폴리곤 수 자체를 줄이는 것이다.

단순하게 생각해서 계산해야 할 객체의 수 자체를 줄여버리는 것인데, 솔직히 말하자면 이것보다 더 확실한 방법이 또 있을까?

물론 그렇다고 무작정 폴리곤 수를 줄여버리는 것은 곤란하다.

폴리곤 수가 많다는 것은 그만큼 디테일한 표현도 가능하다는 것이므로, 폴리곤이 줄어들면 그만큼 디테일이 줄어들 수 있다는 의미이기 때문이다.

그러므로 폴리곤을 줄일 때는 그것이 눈에 띄지 않도록 적절하게 숨기는 일종의 '속임수'를 도입하는 것이 중요하다.

 

1.7.1. 텍스처 매핑 기법 (Texture Mapping)

울퉁불퉁한 표면을 지닌 벽돌 벽을 구현한다고 가정해 보자.

수많은 굴곡과 거친 표면의 형태를 폴리곤 추가하는 방법으로 직접 구현한다면 과연 컴퓨터가 버틸 수 있을까?

인간의 시각에 대해 다루었을 때 언급했던 것처럼 우리는 명암의 차이를 통해서 굴곡(밝은 곳이 어두운 곳보다 더 튀어나온 것처럼 보인다)을 감지할 수 있다.

만약 단순한 정육각형 오브젝트 위에 명암의 차이를 통해 굴곡을 표현한 2D 이미지를 덮어 씌운다면 어떨까?

어차피 계산해야 할 폴리곤의 수는 정육각형에서 바뀌지 않았고, 2D 이미지를 하나 더 추가한 것으로 굴곡 효과까지 구현했으니 직접 폴리곤을 더하여 굴곡을 표현하는 것보다는 훨씬 더 경제적인 방법일 것이다.

텍스처 매핑은 이처럼 3D 모델의 표면에 2D 이미지를 입히는 기법으로, 폴리곤을 더하고 편집하는 것만으로는 표현하기 부담스러운 물체에 디테일을 간편하게 추가하고 현실감을 높이는 효과를 더해준다.

3D 모델에 2D 이미지를 입히기 위해서는 UV 맵(UV Map)이라고 불리는 일종의 '청사진'을 구축해야 한다.

3D 모델이 가지고 있는 버텍스에 2D 이미지의 좌표를 할당하는 것으로, 해당 좌표 값을 기준으로 2D 이미지를 '덮는' 형태로 3D 모델에 입히는 것이다.

텍스처의 종류에 따라서 매핑 기법이 정말 다양해진다.

앞서 언급한 벽돌의 예시처럼 굴곡을 표현하는 텍스처 매핑 기법은 '범프 매핑(Bump Mapping)'이라고 불린다.

다양한 텍스처 매핑 기법들을 일부 나열해 보면 아래와 같다.

- 디퓨즈 텍스처 (Diffuse Texture): 표면의 기본 색상을 나타내는 텍스처로, 물체의 표면이 빛을 확산할 때 나타나는 기본 색상을 표현한다.

- 노멀 매핑 (Normal Mapping): 표면의 법선 데이터를 텍스처로 저장하여 빛의 반사 효과를 세밀하게 만들 때 사용한다.

- 범프 매핑 (Bump Mapping): 높낮이 정보를 명암으로 표현하여 표면의 거칠기와 굴곡을 표현할 때 사용한다.

- 스펙큘러 매핑 (Specular Mapping): 펴면의 반사 강도, 색상을 텍스처로 표현하고자 할 때 사용한다. 물체의 특정 부분만 빛나는 광택 효과 구현에 유용하다.

- 환경 매핑 (Environment Mapping): 물체 표면에 반사되는 주변 환경을 시뮬레이션한다. 물 표면, 유리 등에 반사되는 모습을 표현할 때 사용된다.

- 앰비언트 어클루전 매핑 (Ambient Occlusion Mapping): 빛이 도달하기 어려운 부분(모서리나 틈새 등)에 어두운 음영 효과를 더하기 위해 사용된다. 전역 조명 효과를 간단하게 구현할 때 주로 사용된다.

 

1.7.2. 컬링 기법 (Culling)

컬링 기법은 체험자의 눈에 보이지 않는 곳의 오브젝트, 즉 가려진 오브젝트는 굳이 렌더링 해봤자 의미가 없다는 점을 활용한 최적화 기법이다.

즉, 다른 오브젝트 뒤에 가려진 오브젝트나 화면 밖(카메라의 시야 밖)에 위치한 오브젝트를 렌더링 하기 위해 불필요한 자원을 소모하지 않도록 하는 것이다.

다만 창문이나 거울, 반투명한 오브젝트가  존재할 경우에는 정확한 컬링 처리가 힘들 수도 있다.

LOD가 대표적인 컬링 기법 중 하나로, 로우 폴리곤부터 하이 폴리곤까지 여러 버전의 폴리곤으로 구성된 모델 데이터 중에서 카메라와의 거리에 따라 폴리곤의 수를 유동적으로 조절하는 방법이다.

카메라와 모델 사이의 거리가 멀면 디테일한 표현이 불필요하므로 로우 폴리곤 모델을 사용하고, 가까우면 디테일을 살리기 위해 하이 폴리곤 모델을 사용하는 것이다.

안개나 연기와 같이 시야를 가릴 수 있는 볼륨(Volume) 요소가 존재한다면, 컬링을 더 빨리 활용할 수 있어 유리하다.

의도적으로 안개 등을 활용해서 디테일한 모습은 볼 수 없도록 오브젝트를 가린 뒤, 로우 폴리곤 오브젝트의 실루엣만 활용하는 것이다.

 

1.7.3. 폴리곤 제거 기법 (Polygon Decimation)

폴리곤 제거 기법은 앞서 언급한 오브젝트의 폴리곤 수 자체를 줄이는 방법이다.

오브젝트의 전반적인 형태를 최대한 유지하면서 폴리곤의 수, 특히 삼각형의 수를 줄이는 알고리즘을 사용한다.

메쉬(mesh)는 버텍스(Vertex), 변(Edge), 그리고 면(Face)의 집합으로, 이 메쉬에 있는 폴리곤의 수를 줄이는 것이다.

앞서 언급한 LOD도 어떻게 보면 폴리곤 제거 기법 중 하나라고 부를 수 있다.

더 큰 폴리곤이 더 작은 폴리곤을 대체하면서 나타나게 되는 디테일의 손실은 노멀맵 텍스처(Normal-map Texture)를 생성하는 방식으로 보완이 가능하다.

폴리곤의 수가 줄어들었을 때, 얻을 수 있는 또 하나의 장점은 물리 시뮬레이션 연산 비용 부담이 줄어든다는 것이다.

이는 폴리곤의 수가 줄어드는 만큼 충돌 감지가 단순화되기 때문이며, 이렇게 충돌 감지가 단순화되면 더 많은 오브젝트 간의 충돌 감지 비교가 가능해진다.

실제로 Unity 엔진과 같은 게임 엔진에서는 Collider라고 불리는 단순화된 충돌 감지 전용 메쉬를 따로 사용하기도 한다.

 

1.7.4. 포비티드 렌더링 (Foveated Rendering)

렌더링 효율을 높이는 또 다른 방법은 디테일하게 보여주어야 할 부분과 그렇지 않은 부분을 구분하여 렌더링 품질을 조정하는 '선택과 집중' 방법이다.

포비티드 렌더링은 체험자의 시선이 집중되는 영역에 배치된 사물들은 렌더링 품질을 높이고, 그렇지 않은 외각의 사물들은 렌더링 품질을 낮추는 방법이다.

이를 위해서는 체험자의 시선을 추적할 수 있는 방안을 따로 마련해야 하므로, HMD 기기를 사용하는 방식에서 구현하기가 용이하다.

이와 유사한 기법으로 다중 해상도 셰이딩 기법도 존재한다.

이는 포비티드 렌더링과 원리는 동일하지만 셰이더 표현에 해당 기법을 적용하는 것이다.

 

1.8. 고급 텍스처 매핑 기법

1.8.1. 라이트 베이킹(Light Baking)

텍스처를 활용하면 라이팅 연산 비용을 줄일 수 있다.

가상 세계 속에서 라이팅이 오브젝트의 표면에 어떤 영향을 미치는지를 미리 계산해서 라이팅 효과 결과물을 텍스처에 통합시키는 것이다.

즉, 라이팅의 결과물을 하나의 이미지로 '구워버리는(Baking)' 것이다.

이렇게 한 번 이미지를 생성해 두면 그냥 이미지를 불러오기만 하면 되므로 연산 작업에 드는 비용을 크게 절약할 수 있다.

하지만 라이트 베이킹 기법을 통해 생성된 이미지는 말 그대로 '이미지'이기 때문에 동적인 오브젝트에는 활용할 수는 없다.

즉, 주인공 캐릭터나 거리를 돌아다니는 자동차 등의 그림자는 실시간으로 라이트 연산이 이루어져야 하기 때문에 이러한 오브젝트에는 라이트 베이킹 기법을 적용할 수 없다.

 

1.8.2. 영상 기반 렌더링 (Image-Based Rendering)

IBR 기법은 씬 렌더링 시간과 복잡성을 개선하기 위해 이미지를 활용하는 기법을 통틀어서 일컫는 용어이다.

IBR 기법의 가장 큰 특징은 렌더링 시간을 줄이기 위해서 이전에 렌더링 한 이미지 또는 캡처한 이미지의 기하학적 복잡도를 줄이거나 제거하여 다음 씬 렌더링에 활용한다는 것이다.

가장 간단한 형태의 IBR은 실제 세계 속 사물의 사진을 찍어서 이를 폴리곤 또는 폴리곤 집합 위에 덮어씌우는 것이다.

 

1.8.3. 다중 패스 렌더링 (Multipass Rendering)

다중 패스 렌더링 기법은 텍스처 맵 메모리를 활용해 그림자, 거울을 통한 반사, 렌즈 효과, 안티앨리어싱 등을 연산하는 등 다양한 효과를 추가하여 렌더링 품질을 향상하는 기법이다.

예를 들어 그림자는 광원의 POV(Point Of View)에서 씬을 렌더링 하고 그 결과를 텍스처 메모리에 저장한다.

즉, 텍스처 메모리에는 광원의 POV에서 각 픽셀이 얼마나 먼 거리에 있는지에 대한 정보가 깊이 맵 형태로 저장된다.

그런 다음 카메라가 보는 화면에 출력될 픽셀 데이터를 계산하는 단계인 카메라의 렌더링 패스(Rendering Pass)에서 해당 그림자 텍스처(Shadow Texture)를 사용해 빛이 닿지 않아 어두운 영역을 어둡게 처리하는 연산을 진행한다.

 

1.8.4. 빌보딩(Billboarding)

빌보딩은 데칼코마니 또는 자동차처럼 대칭적인 형태를 띤 오브젝트를 렌더링 할 때 유용한 기술이다.

나무처럼 구조가 복잡한 오브젝트들은 구현을 단순화하기 위해 투명한 배경을 지닌 잎사귀 텍스처를 평면(Plane) 오브젝트에 매핑하여 구현하는 것이 일반적이다.

이러한 오브젝트들은 멀리서 볼 때는 티가 나지 않지만, 가까이서 보게 되면 평면 오브젝트에 텍스처를 매핑했다는 것이 금방 들통나게 된다.

이때 활용할 수 있는 트릭 중 하나가 평평한 폴리곤이 항상 뷰어를 향하게 회전시키는 것이다.

오리지널 버전의 <DOOM>에서 아이템이나 시체가 둠가이의 움직임과 방향에 따라 회전하며 항상 같은 각도로 보이게 연출한 모습을 떠올려보면 이해하기 쉽다.

다만 이 기법을 활용하려면 항상 오브젝트와 뷰어가 직교 상태를 유지해야 한다.

게임 속 나무를 위에서 바라보았는데도 앞에서 바라본 것과 같은 이미지가 보인다면 차라리 장르를 호러로 바꾸는 것이 더 현명할지도 모른다.

 

1.8.5. 다중 뷰 텍스처 매핑 (Multiple-view Texture Mapping)

다중 뷰 텍스처 매핑은 깃털이나 발광체처럼 실시간 렌더링 기법으로 구현하기 어려운 형태의 물리적 오브젝트를 렌더링 할 때 활용된다.

여러 뷰에서 얻은 텍스처 데이터를 사용해서 오브젝트의 표면을 사실적으로 렌더링 하는 것으로, 오브젝트를 다양한 관점에서 촬영하거나 렌더링 하여 텍스처 데이터를 미리 수집할 필요가 있다.

이 수많은 텍스처 데이터는 '텍스처 블렌딩' 작업을 거쳐서 자연스럽게 이어 붙이게 되며, 데이터가 누락된 부분은 보간을 통해서 메꾸게 된다.

여러 뷰에 대한 데이터를 미리 준비하고 저장해야 하기 때문에 메모리 사용량은 증가하겠지만, 보다 사실적이고 디테일한 텍스처 품질을 유지할 수 있어 활용도가 높은 편이다.

 


 

2. 비주얼 렌더링 레이턴시

레이턴시는 VR에서 매우 민감하게 다루어야 하는 분야이다.

우리는 어떠한 상호작용을 취할 때 '딜레이'라는 걸 느낄 수 없는 매우 빠른 속도의 현실 세계에서 살아가고 있다.

어떠한 사물을 집어 들면 그에 따른 즉각적인 피드백이 가해지는 것은 현실 세계에서는 당연한 이치이다.

이 때문에 가상 현실도 체험자의 입력에 충분히 빠르게 반응하지 않으면 현실감이 줄어들뿐더러, 체험자는 불쾌함이나 멀미 등의 부작용을 호소하게 된다.

일반적으로 VR에서 다루는 레이턴시의 시간 단위는 ms(밀리초)이다.

만약 90Hz의 속도로 렌더링을 하고 있다면, 프레임 1장을 렌더링 하는 데 걸리는 시간은 대략 11.1ms가 된다.

하지만 이 11.1ms가 순수하게 렌더링에 투자할 수 있는 시간이 아니라는 점을 기억해야 한다.

즉, 체험자 신체의 움직임을 추적하고, 물리 연산을 수행하고, 데이터 통신을 수행하는 가상 세계를 렌더링 하기 위해 필요한 모든 연산 작업들을 포함한 시간이 11.1ms이다.

일반적으로 체험자가 행동을 취했을 때부터 그에 따른 반응을 보기까지 걸리는 시간을 MTP(Motion To Photon)이라고 부른다.

보편적으로 지켜야 하는 MTP의 기준점을 따로 정해둔 것은 아니기는 하지만, 대부분 7ms 또는 3ms처럼 절대 넉넉한 수치를 다루지는 않는다.

레이턴시가 줄어들면 그만큼 경험의 질이 전반적으로 상승하는 것이 사실이기 때문이며, 역동적인 행동이 많은 스포츠 분야에서는 더더욱 이러한 변화가 두드러지기 마련이다.

레이턴시를 줄이기 위한 가장 기본적인 방법 두 가지는 다음과 같다.

- 입력 장치가 컴퓨터로 데이터를 전송하는 속도를 최대화하기

- 컴퓨터 그래픽 이미지를 생성하는 데 걸리는 시간을 최소화하기

다만 컴퓨터 구조를 다룰 때도 언급되지만, 컴퓨터가 데이터를 처리하는 모든 과정을 통틀어서 비교해 보아도 체험자의 입력을 받아서 처리하는 '입력 처리 시간'이 압도적으로 가장 느리다.

이 때문에 아무리 빨리 입력 장치가 체험자의 입력을 인식하여 컴퓨터로 데이터를 전송한다고 해도 그 한계가 매우 명확하다.

후자의 경우에는 멀티 스레드, 멀티 프로세서의 적극적인 활용, 고성능 하드웨어 도입, 앞서 언급한 렌더링 최적화 기법의 적극적인 도입 등 매우 다양한 방법으로 구현이 가능하다.

다만 최소 레이턴시가 무조건적으로 좋은 것은 아니다.

최소 레이턴시가 과하게 낮아서 프레임 1장이 너무 오래 '생존'하게 되면, 새로운 프레임으로 전환하는 데 걸리는 시간이 길어지기 때문에 전체적인 레이턴시가 역으로 증가할 수 있기 때문이다.

이 때문에 최소 레이턴시보다는 평균 레이턴시에 집중하는 것이 더 효과적일 수 있다.

 

2.1. 다중 렌더링 (클러스터)

다중 렌더링 기법은 여러 CPU/GPU를 동시에 활용할 수 있는 클러스터 컴퓨팅 시스템이 구축되어 있는 환경에서 활용할 수 있는 방법이다.

이미지를 렌더링 하는 속도를 높이기 위해서 각자의 렌더링 영역을 나눠서 처리하는 것이다.

클러스터 구축과 안정성 문제, 비용 문제를 제외한다면 레이턴시를 줄일 수 있는 가장 강력한 방법이기도 하다.

GPU를 2개 이상 사용하는 컴퓨터 시스템에서는 프레임을 번갈아가면서 렌더링 하는 스왑 체인(Swap Chain) 기법을 사용할 수도 있다.

스왑 체인 기법과 유사한 DPLEX 디컴포지션(DPLEX decomposition) 기법은 오브젝트나 픽셀이 아니라 시간을 기준으로 다중 렌더링을 진행하여 시스템의 최소 레이턴시를 줄이는 것보다는 전체 평균 레이턴시를 줄이는 것에 집중하였다.

 

2.2. 타임 워핑

이미 렌더링 된 이미지를 새로운 변화에 따라 재조정하는 방식으로 레이턴시를 감소시키는 타임 워핑(Time Warping) 기법도 존재한다.

이 기법은 렌더링을 일단 먼저 해둔 다음에, 나중에 오는 정보에 맞게 렌더링 이미지를 조정하여 사용하는 기법이기 때문에 시간을 뒤트는 듯한 느낌을 주어 '타임 워핑'이라는 용어가 붙었다.

HMD 기기를 착용한 체험자의 VR 경험을 예로 들어보자.

체험자가 머리를 돌리거나 움직임에 따라서 변화하는 트래킹 값은 실시간으로 렌더링 연산에 반영되어야 한다.

체험자의 머리가 살짝 흔들렸다는 이유만으로도 반복적인 연산을 계속 수행하기에는 부담이 상당할 것이다.

그러므로 타임 워핑 기법에서는 체험자에게 필요한 이미지보다 더 큰 이미지를 미리 렌더링 한 뒤, 체험자의 머리 움직임에 따른 변화만 따로 연산하여 그에 맞게 이미지를 변형시키게 된다.

만약 머리가 미리 렌더링 된 이미지의 영역보다 더 크게 움직이거나 회전하게 된다면 발생할 수 있는 렌더링 공백 영역은 IBR 알고리즘을 사용해 채우는 방법을 도입해 볼 수도 있을 것이다.

 

2.3. 씬 품질 동적 조정

씬에 있는 모든 요소들이 언제나 항상 똑같이 높은 품질을 유지해야 할 필요는 없다.

체험자가 어떠한 섬세한 작업을 하기 위해 특정 영역 안에서만 활동하고 있을 때는 그 영역 밖에 있는 오브젝트에 대한 렌더링 품질을 높이는 것은 무의미하다.

만약 이러한 요소들이 레이턴시 저하의 영향을 미칠 수 있다면 차라리 씬의 품질을 유동적으로 조정(오브젝트 삭제, 텍스처 퀄리티 저하 등)하여 레이턴시 확보를 우선시하는 것이 더 효과적일 수 있다.

빠르게 움직이는 레이싱 게임에서 스쳐 지나가는 군중들의 모델링 품질이 바로 옆에서 경쟁하고 있는 경주용 차량의 디테일만큼이나 중요할까?

애초에 군중이 얼마나 있는지 보이기나 할까?

차라리 군중의 렌더링 품질을 형체만 알아볼 수 있을 정도로 대폭 낮추고, 그렇게 확보한 컴퓨팅 자원을 경주용 차량의 디테일을 끌어올리는 데 사용하는 것이 효율적일 것이다.

텍스처 맵 해상도를 한 단계 낮추는 작업만 적용하여도 소모적인 메모리 액세스는 눈에 띄게 줄어들 수 있기 때문에 씬 품질을 동적으로 조정하는 방법은 생각보다 상당히 강력한 효과를 발휘한다.

현대 GPU의 성능이 굉장히 발전하였다 하더라도 그만큼 씬의 복잡도가 기하급수적으로 올라갔으며, 체험자의 요구치도 올라간 것이 사실이기 때문에 고성능 GPU를 도입한다는 것이 마냥 해법이 될 수는 없다.

또한 휴대용 VR/AR 디스플레이나 스마트폰, 노트북처럼 전력 소모에 민감하고 데스크톱처럼 고성능 자원을 마음대로 사용할 수 없는 환경일 경우 이러한 제약은 더더욱 커질 수밖에 없다.

이러한 기술을 초창기에 적용한 사례를 꼽자면 옥스퍼드 대학교에서 개발한 볼륨 비주얼라이제이션 도구인 클럼스(Crumbs)가 있다.

1995년도에 사용된 클럼스는 그 당시에도 볼륨 렌더링 기법은 연산 비용이 매우 컸기 때문에 레이턴시와 렌더링 속도를 확보하고자 일시적으로 볼륨 렌더링을 비활성화하는 방법을 사용하였다.

 


 

3. 비주얼 렌더링 프로세스

3.1. GPU

GPU는 컴퓨터 그래픽 작업에 필요한 연산을 처리하는 역할을 수행하는 부품으로 비주얼 렌더링을 위해서는 필수적인 하드웨어이다.

CPU와 달리 병렬 연산 작업에 특화되어 있으며, 현대에는 CPU가 처리하던 연산을 GPU에 일부 부담하여 연산 속도를 올리는 GPGPU(General-Purpose GPU)가 등장하기도 했다.

GPU는 CPU와 다르게 순전히 대량 계산에 용이하도록 설계되어 있다.

CPU는 소수의 고성능 코어로 구성되어 있으며, 레지스터를 비롯한 캐시 메모리를 가지고 다양한 환경에서 마주하는 복잡한 명령어들을 효율적으로 처리할 수 있도록 설계되어 있다.

그 반면에 GPU는 수천 개가 넘는 엄청난 양의 코어로 구성되어 있으며, 각 코어는 간단한 연산 처리에 특화되어 있다.

즉, 동일한 명령을 한꺼번에 많이 처리하도록 설계되어 있는 것이다.

또한 CPU보다 레지스터, 캐시 메모리의 용량은 작지만, 고대역폭 메모리와 연결되어 대량의 데이터를 처리하기 용이하도록 설계되어 있다.

또한 GPU는 멀티 프로세서 구조를 띄고 있어 동시에 수많은 스레드를 처리할 수 있다.

현대에는 저전력, 임베디드, 모바일 디바이스에서 사용할 수 있도록 GPU와 CPU를 하나의 칩셋으로 통합하는 사례도 쉽게 찾아볼 수 있다.

APU가 대표적이며, 대부분 모바일이나 저전력 하드웨어 시장에서 주로 등장하기 때문에 Apple 사의 M 칩셋처럼 ARM 기반 아키텍처를 사용하는 경우가 많다.

 

3.2. 애셋 (Asset)

가상 세계를 구성하기 위해서는 수많은 오브젝트(객체)를 조합하고 배치해야 한다.

이 오브젝트들은 앞서 살펴본 것처럼 폴리곤으로 구성된 데이터 집합, '폴리곤 메시(Polygon Mesh)'로 구성되어 있으며, 이 폴리곤 메시는 별도의 데이터 포맷으로 저장하고 관리하는 것이 가능하다.

FBX, obj, X3D, blender 등의 확장자가 대표적인 폴리곤 메시 저장을 위해 사용되는 데이터 포맷이며, 3D 모델을 제작하는 다양한 툴에 따라서 호환성과 지원하는 포맷 범위가 달라진다.

이렇게 별도로 저장되고 관리되는 폴리곤 메시는 '애셋(Asset)'이라는 용어로 불리기도 하는데, 이름에서 알 수 있듯이 가상 현실을 제작하는 개발자 입장에서는 이 데이터들이 하나의 '자원'으로 취급된다.

이러한 애셋을 본인이 제작하여 판매하거나 공유하는 플랫폼(Unity AssetStore)도 존재하며, 아예 별도의 툴을 사용하지 않고 게임 엔진 내에서 폴리곤 메시를 제작하는 경우도 생겨나고 있다.

애셋의 구성을 살펴보면 하나의 계층 구조(Tree)를 띄고 있다.

밤에 몰래 나와서 초코파이 까먹을 때 유용할 것처럼 생긴 4인용 식탁을 만든다고 가정하면, 식탁의 다리 4개와 상판은 하나의 계층 구조로 묶여있다.

계층 구조로 묶이게 되면 부모 객체의 움직임과 회전은 자식 객체에게도 영향을 미치기 때문에 데이터 관리와 상호작용 구현이 매우 수월해진다.

즉, 식탁의 위치를 바꾸기 위해서 다리 4개와 상판 1개를 일일이 하나씩 움직이는 것이 아니라 최상위 객체인 '식탁'의 위치 값을 바꾸기만 하면 자식 객체인 다리 4개, 상판 1개도 함께 움직인다는 것이다.

Unity 엔진을 비롯하여 대부분의 게임 엔진과 3D 모델링 프로그램은 이 계층 구조를 모두 적용해 사용하고 있으며, 이를 하나의 그림으로 표현해보면 아래와 같다.

 

3.3. 비주얼 렌더링 소프트웨어

렌더링 소프트웨어는 렌더링 명령어를 하드웨어가 수행할 수 있게 전달하는 역할을 수행한다.

즉, 개발자가 제작한 3D 모델(애셋)에 텍스처, 조명, 그림자 등을 적용하고, 물리 법칙을 시뮬레이션하고, 애니메이션을 적용하는 등 렌더링 결과물을 생산하기 위해서 컴퓨터 하드웨어에 렌더링 수행 명령을 내리는 것이다.

비주얼 렌더링은 게임 엔진과 같이 실시간 렌더링이 요구되는 환경과 애니메이션 프레임 렌더링과 같이 비 실시간(배치 모드 렌더링) 환경으로 구분되는데, 다양한 용도에 따라서 그에 적합한 그래픽 API(OpenGL, Direct X 등)를 통해 구현된다.

일반적으로 렌더링 소프트웨어는 렌더링 그 자체만 수행하는 독립적인 애플리케이션으로 구성되기 보다는 하나의 미들웨어 형태로 구성되어 게임 엔진이나 3D 모델링 툴에 내장되는 형태로 존재하는 것이 일반적이다.

 

3.4. 좌표계(Coordinate System)와 변환(Transformation)

3D 공간을 다루고 있기 때문에 가상 세계에서의 좌표계는 현실 세계와 동일하게 X축, Y축, Z축으로 구성된 3차원 좌표계를 사용한다.

그런데 안타깝게도 3D 공간을 다루는 다양한 소프트웨어를 비교해보면 "그래서 어디가 위쪽인가?"에 대한 대답이 모두 다르다는 것을 알 수 있다.

이는 사용하는 좌표계의 기준이 다르기 때문인데, Unity 엔진의 경우에는 '왼손 좌표계 + Y축이 위'를 기준으로 사용하고 있다.

반면에 Unity 엔진과 동일하게 게임업계에서 주로 사용된다고 알려진 3D Max의 경우에는 '오른손 좌표계 + Z축이 위'를 기준으로 사용하고 있다.

이러한 좌표계 문제는 다른 소프트웨어에서 제작한 애셋을 불러와 사용할 때 문제가 된다.

분명히 3D Max에서 제작할 때는 아무런 문제가 없었는데, Unity 엔진에서 해당 애셋을 불러왔더니 애셋이 한 쪽으로 누워있는 상태로 불러와지는 것이다.

제발 어디서 하나의 축으로 통일해서 사용했으면 좋겠지만, 안타깝게도 아직은 아래 사진과 같이 다양한 축이 함께 공존하는 시대가 이어지고 있다.

변환은 좌표계와 더불어 3D 공간을 정의하는 가장 기본적인 개념이다.

크기, 회전, 위치 좌표(X, Y, Z)를 정의하는 개념으로, 해당 오브젝트가 어떤 크기이며, 얼마나 회전해있고, 어느 위치에 존재하는지를 결정한다.

또한 3차원 공간 상에서의 거리감을 표현하는 '원근법'의 존재 유무에 따라서 퍼스펙티브 뷰(Perspective View)와 오르토그래픽 뷰(Orthographic View)로 나누어 다룰 수 있다.

퍼스펙티브 뷰는 객체의 크기와 거리 등에 따라 거리감/깊이감이 느껴지도록 표현된 뷰로, 현실 세계에서 우리가 3차원 공간을 바라볼 때 느끼는 거리감/깊이감을 그대로 제현한 뷰이다.

오르토그래픽 뷰는 그러한 거리감/깊이감을 제거하여 객체의 크기나 거리와 무관하게 항상 동일한 크기로 표현하는 뷰이다.

오르토그래픽 뷰는 건축 도면이나 청사진 등을 제작할 때 주로 활용되며, 퍼스펙티브 뷰는 1인칭 또는 3인칭 공간을 현실감있게 재현하고자 하는 경우에 주로 활용된다.

 


 


수고하셨습니다!


'Dev. Study Note > VR Introduction' 카테고리의 다른 글

촉각 렌더링 시스템  (0) 2025.01.21
사운드 렌더링 시스템  (0) 2025.01.20
렌더링 시스템  (0) 2025.01.12
가상 세계의 기타 감각 표현  (0) 2025.01.11
가상 세계의 촉각 표현  (0) 2025.01.11
Comments