본문 바로가기

레이 트레이싱 Ray Tracing

@iamrain2025. 12. 18. 21:23

1. Ray Tracing

1.1. 레이 트레이싱이란?

레이 트레이싱(Ray Tracing, 광선 추적)은 3D 컴퓨터 그래픽스 이미지를 생성하는 렌더링 기술 중 하나로, 빛의 물리적 동작을 시뮬레이션하는 데 중점을 둡니다. 가상의 카메라(시점)에서 화면의 각 픽셀을 향해 광선을 쏘아 보낸 후, 이 광선이 씬(Scene) 내부의 물체(Object)와 부딪히는 지점을 계산합니다. 부딪힌 지점의 재질(Material), 광원(Light Source)과의 상호작용 등을 계산하여 해당 픽셀의 색상을 결정합니다.

이 과정은 빛의 경로를 역으로 추적하는 것과 같습니다. 실제 세계에서는 광원에서 나온 빛이 물체에 반사되어 우리 눈에 들어오지만, 모든 광원에서 나오는 무수히 많은 광선을 전부 계산하는 것은 비효율적이므로, 최종적으로 눈(카메라)에 들어오는 광선만을 역추적하는 방식을 사용합니다.

광선이 물체에 부딪히면, 해당 지점에서 여러 현상을 시뮬레이션하기 위해 2차 광선(Secondary Rays)을 생성할 수 있습니다.

  • 반사(Reflection) 광선: 거울과 같은 재질을 만나면 정반사 방향으로 새로운 광선을 쏩니다.
  • 굴절(Refraction) 광선: 유리나 물과 같은 투명한 재질을 통과할 때 빛이 꺾이는 현상을 시뮬레이션합니다.
  • 그림자(Shadow) 광선: 물체에 부딪힌 지점에서 각 광원을 향해 광선을 쏘아, 중간에 다른 물체에 의해 가려지는지를 판단하여 그림자 여부를 결정합니다.
  • 앰비언트 오클루전(Ambient Occlusion) 광선: 표면의 틈새나 구석진 곳이 주변광(Ambient Light)을 얼마나 덜 받는지를 계산하여 사실적인 음영을 추가합니다.

이러한 재귀적인(Recursive) 광선 추적을 통해 물리적으로 매우 정확하고 사실적인 이미지를 생성할 수 있으며, 이는 전통적인 래스터라이제이션 방식으로는 구현하기 어려운 전역 조명(Global Illumination), 부드러운 그림자(Soft Shadows), 정확한 반사 및 굴절 등을 자연스럽게 표현할 수 있게 합니다.

1.2. 전통적인 래스터라이제이션과의 차이점

래스터라이제이션(Rasterization)은 3D 모델을 구성하는 정점(Vertex)들을 2D 화면 공간에 투영(Projection)한 후, 이 정점들로 이루어진 삼각형(Triangle) 내부의 픽셀들을 채워나가는 방식입니다. 이는 GPU 하드웨어에 매우 친화적이고 속도가 매우 빠르다는 장점이 있어 수십 년간 실시간 렌더링의 표준으로 자리 잡았습니다.

하지만 래스터라이제이션은 본질적으로 '물체가 화면의 어디에 보이는가'에만 집중하는 방식이므로, 빛의 물리적인 상호작용을 직접 시뮬레이션하지 않습니다. 그림자, 반사, 전역 조명과 같은 효과들은 래스터라이제이션 파이프라인 위에서 별도의 기법들(예: Shadow Mapping, Screen Space Reflections, Light Probes)을 통해 근사치로 구현됩니다. 이러한 기법들은 빠르지만, 물리적 정확성이 떨어져 여러 가지 시각적 한계(Artifacts)를 드러내곤 합니다.

구분 레이 트레이싱 (Ray Tracing) 래스터라이제이션 (Rasterization)
기본 원리 픽셀 단위로 광선을 추적 (Pixel-centric) 오브젝트 단위로 화면에 투영 (Object-centric)
정확성 물리 기반으로 매우 높음 근사치 계산으로 상대적으로 낮음
주요 효과 반사, 굴절, 그림자, GI 등을 통합적으로 처리 셰이더와 특수 기법으로 각 효과를 개별 구현
시각적 품질 사실적이고 아티팩트가 적음 SSR의 한계, Shadow Map의 Aliasing 등 아티팩트 발생 가능
연산 비용 씬의 복잡도와 광선 수에 따라 매우 높음 정점 및 픽셀 수에 비례하며, 상대적으로 매우 빠름
하드웨어 RT Core 등 전용 가속 하드웨어 필요 (실시간의 경우) 표준 GPU 파이프라인에서 고속으로 처리

2. 언리얼 엔진의 실시간 레이 트레이싱

언리얼 엔진은 Microsoft의 DXR(DirectX Raytracing)과 Vulkan Ray Tracing API를 기반으로 실시간 레이 트레이싱을 지원합니다. 이는 전통적인 래스터라이제이션 기반의 디퍼드 렌더러(Deferred Renderer)와 통합된 하이브리드(Hybrid) 방식으로 동작하며, 래스터라이제이션의 속도와 레이 트레이싱의 품질을 조합하여 사용합니다.

2.1. 활성화 방법 및 요구 사양

  • 플랫폼: Windows 10/11 (특정 버전 이상), DirectX 12
  • 하드웨어: NVIDIA RTX 20 시리즈 이상, AMD RX 6000 시리즈 이상 등 레이 트레이싱 가속을 지원하는 GPU
  • 프로젝트 설정: Project Settings > Engine > Rendering > Ray Tracing 에서 Support Hardware Ray Tracing 활성화.

2.2. 주요 기능

언리얼 엔진은 레이 트레이싱을 통해 다음과 같은 주요 그래픽 효과들을 렌더링합니다.

  • 레이 트레이싱 반사 (Ray Tracing Reflections)
    • 화면 공간에 정보가 없는(Off-screen) 물체도 정확하게 반사합니다.
    • 여러 번의 반사(Multi-bounce)를 지원하여 거울 속의 거울과 같은 표현이 가능합니다.
    • 래스터라이제이션 기반의 SSR(Screen Space Reflections)이나 Reflection Probes의 한계를 극복합니다.
  • 레이 트레이싱 그림자 (Ray Tracing Shadows)
    • 광원의 크기(Source Radius)를 고려하여 물리적으로 정확한 부드러운 그림자(Soft Shadows)를 생성합니다.
    • 기존의 Shadow Map에서 발생하는 Aliasing이나 Peter-panning 현상이 없습니다.
  • 레이 트레이싱 앰비언트 오클루전 (Ray Tracing Ambient Occlusion, RTAO)
    • 구석이나 틈새의 접촉 음영을 더욱 정확하고 광범위하게 계산합니다.
    • SSAO(Screen Space Ambient Occlusion)보다 훨씬 높은 품질의 결과를 보여줍니다.
  • 레이 트레이싱 글로벌 일루미네이션 (Ray Tracing Global Illumination, RTGI)
    • 빛이 물체에 부딪혀 반사되면서 주변을 밝히는 간접광(Indirect Lighting)을 실시간으로 시뮬레이션합니다.
    • 언리얼 엔진 5에서는 Lumen 시스템의 일부로 통합되었으며, 하드웨어 레이 트레이싱을 사용할 경우 Lumen은 더욱 정확하고 빠른 GI를 구현하기 위해 레이 트레이싱을 활용합니다. (Lumen은 Software Ray Tracing도 지원)
  • 레이 트레이싱 반투명 (Ray Tracing Translucency)
    • 유리나 물과 같은 반투명 재질의 정확한 굴절과 반사를 표현합니다.
    • 기존의 래스터라이제이션 방식으로는 매우 구현하기 어려운 사실적인 반투명 효과를 제공합니다.

3. 내부 구조 및 구현 방식

언리얼 엔진의 레이 트레이싱은 DXR API의 핵심 구성요소들을 기반으로 추상화되어 있으며, 엔진의 렌더링 파이프라인에 깊숙이 통합되어 있습니다.

3.1. DirectX Raytracing (DXR) API

DXR은 레이 트레이싱을 위한 새로운 GPU 파이프라인과 셰이더 타입을 정의합니다.

  • Ray Generation Shader (레이 생성 셰이더): 렌더링의 시작점으로, 카메라 위치에서 픽셀 방향으로 초기 광선(Primary Ray)을 생성하고 TraceRay() 함수를 호출합니다.
  • Intersection Shaders (교차 셰이더): 광선이 어떤 도형(Geometry)과 교차했는지 판정합니다.
    • Closest-Hit Shader: 광선 경로에서 가장 가까운 교차점에서 호출되며, 해당 지점의 머티리얼 특성을 기반으로 색상을 계산하거나 2차 광선을 생성합니다.
    • Any-Hit Shader: 교차점을 찾았을 때마다 호출되며, 주로 투명한 텍스처(Alpha Masking) 등을 처리하여 불필요한 교차를 무시하는 데 사용됩니다.
  • Miss Shader (미스 셰이더): 광선이 씬의 어떤 물체와도 부딪히지 않았을 때 호출됩니다. 주로 배경색이나 스카이박스의 색상을 반환합니다.

3.2. 가속 구조 (Acceleration Structures)

수백만 개의 삼각형으로 이루어진 씬에서 모든 삼각형과 광선의 교차를 테스트하는 것은 비현실적입니다. 이를 가속하기 위해 DXR은 BVH(Bounding Volume Hierarchy) 라는 자료구조를 사용합니다. BVH는 씬의 물체들을 감싸는 경계 상자(Bounding Box)들을 계층적인 트리 구조로 구성한 것입니다. 광선은 먼저 상위 레벨의 큰 경계 상자들과 교차 테스트를 하고, 교차가 일어난 경우에만 해당 상자에 포함된 하위 상자들 또는 실제 삼각형들과 테스트를 진행합니다. 이를 통해 불필요한 교차 연산을 기하급수적으로 줄일 수 있습니다.

DXR은 두 단계의 BVH를 사용합니다.

  1. BLAS (Bottom-Level Acceleration Structure): 개별 메시에 대한 가속 구조입니다. Static Mesh, Skeletal Mesh 등 각각의 에셋에 대해 미리 빌드됩니다.
  2. TLAS (Top-Level Acceleration Structure): 전체 씬에 대한 가속 구조입니다. 씬에 배치된 모든 액터(BLAS 인스턴스)들의 위치, 회전, 크기 정보를 담고 있으며, 매 프레임마다 업데이트됩니다.

언리얼 엔진 내부에서 FPrimitiveSceneProxy는 렌더링 스레드에서 씬의 프리미티브를 나타내는 객체이며, 레이 트레이싱이 활성화되면 각 프록시는 자신의 FRayTracingGeometry를 생성하고 BLAS를 빌드하는 역할을 합니다. FScene은 이러한 프록시들의 집합을 관리하며, 매 프레임 FDynamicRayTracingScene을 통해 TLAS를 빌드하여 GPU에 전달합니다.

3.3. 디노이저 (Denoiser)

실시간 레이 트레이싱에서는 성능 제약 때문에 픽셀당 소수의 광선(예: 1-4개)만을 사용합니다. 이는 몬테카를로 적분 과정에서 분산(Variance)을 충분히 줄이지 못해 결과 이미지에 심각한 노이즈(Noise)를 발생시킵니다.

이 문제를 해결하기 위해 언리얼 엔진은 정교한 디노이저(Denoiser)를 사용합니다. 디노이저는 노이즈가 낀 이미지를 입력받아 깨끗한 이미지로 재구성하는 후처리(Post-processing) 필터입니다. 단순히 이미지를 흐릿하게 만드는 것이 아니라, G-Buffer의 정보(월드 노멀, 깊이, 러프니스 등)를 활용하여 물체의 경계나 재질 특성을 보존하면서 노이즈를 제거합니다. 또한, 이전 프레임의 정보를 현재 프레임으로 재투영(Reprojection)하는 시간적 필터링(Temporal Filtering) 기법을 함께 사용하여 여러 프레임에 걸쳐 샘플을 누적하는 효과를 내어 매우 효율적으로 노이즈를 줄입니다.

3.4. 하이브리드 렌더링 (Hybrid Rendering)

언리얼 엔진은 순수한 레이 트레이서가 아닌, 디퍼드 렌더링과 레이 트레이싱을 결합한 하이브리드 방식을 채택합니다.

  1. Base Pass: 먼저 래스터라이제이션을 통해 G-Buffer(Base Color, Normal, Roughness, Depth 등)를 생성합니다.
  2. Ray Tracing Passes: G-Buffer 정보를 활용하여 레이 트레이싱 반사, 그림자, GI 등을 계산합니다. 예를 들어, 반사를 계산할 때 G-Buffer의 픽셀 위치와 노멀을 사용하여 반사 광선을 생성하고, 이 광선이 부딪힌 지점의 정보를 가져와 반사 색상을 결정합니다.
  3. Lighting Pass: 래스터라이제이션으로 계산된 직접광과 레이 트레이싱으로 계산된 간접광, 그림자, 반사 등을 모두 조합하여 최종 픽셀 색상을 계산합니다.

이러한 방식은 래스터라이제이션의 빠른 속도로 기본 씬을 렌더링하고, 레이 트레이싱으로는 래스터라이제이션이 취약한 특정 효과들만 선택적으로 강화하여 성능과 품질의 균형을 맞춥니다.

4. 동작 계층 구조

레이 트레이싱 렌더링이 사용자 입력부터 실제 하드웨어에서 처리되기까지의 과정은 여러 계층을 거칩니다.

  1. 사용자/아티스트 레벨 (User/Artist Level)
    • 아티스트는 Post Process Volume, 라이트 액터, 메시 에디터 등에서 레이 트레이싱 관련 옵션(강도, 샘플 수, 최대 거리 등)을 조정합니다.
    • r.RayTracing.* 와 같은 콘솔 변수를 통해 전역적으로 레이 트레이싱 기능을 제어합니다.
  2. 엔진 렌더링 레벨 (Engine Rendering Level - FDeferredShadingSceneRenderer)
    • 렌더링 루프의 메인 클래스인 FDeferredShadingSceneRenderer는 매 프레임 Render() 함수를 호출합니다.
    • 이 함수 내에서 현재 뷰(View)에 필요한 렌더링 패스를 결정합니다. 레이 트레이싱이 활성화되어 있으면 RenderRayTracingReflections, RenderRayTracingAmbientOcclusion, RenderLumenScene 등의 함수가 호출 목록에 포함됩니다.
    • 언리얼 엔진의 RenderGraph (RDG) 시스템이 이 과정에 관여합니다. 각 렌더링 패스는 필요한 리소스(텍스처, 버퍼)와 수행할 작업을 RDG에 등록합니다. RDG는 이러한 패스들 간의 의존성을 분석하여 최적의 실행 순서를 결정하고, 불필요한 리소스 할당 및 복사를 최소화합니다.
  3. RHI (Rendering Hardware Interface) 레벨
    • RDG에 등록된 레이 트레이싱 패스는 실제 실행 시점에 RHI 계층을 통해 GPU에 명령을 전달합니다.
    • RHI는 DirectX 12, Vulkan, Metal 등 다양한 그래픽 API의 차이점을 추상화하는 역할을 합니다.
    • 레이 트레이싱을 위해 FRHICommandList::BuildAccelerationStructure(), FRHICommandList::DispatchRays() 와 같은 RHI 명령어가 호출됩니다. 이는 내부적으로 DXR의 BuildRaytracingAccelerationStructure()DispatchRays() 같은 API 호출로 변환됩니다.
  4. 드라이버/하드웨어 레벨 (Driver/Hardware Level)
    • GPU 드라이버는 RHI를 통해 전달된 명령을 해석하여 GPU가 이해할 수 있는 코드로 변환합니다.
    • DispatchRays() 명령이 실행되면, GPU의 레이 트레이싱 전용 하드웨어(NVIDIA의 RT Core, AMD의 Ray Accelerator)가 활성화됩니다.
    • 이 전용 하드웨어는 BVH 순회(Traversal)와 레이-삼각형 교차 테스트(Intersection) 연산을 매우 높은 속도로 병렬 처리합니다. 이 가속 덕분에 실시간 레이 트레이싱이 가능해집니다.
    • 교차 결과에 따라 GPU의 컴퓨팅 유닛(CUDA Core 등)에서 해당 지점의 Closest-Hit 또는 Miss 셰이더가 실행되어 음영 계산을 수행합니다.

5. 래스터라이제이션 vs. 레이 트레이싱 비교

구분 장점 단점 추천 사용 사례
래스터라이제이션 - 매우 빠름: 하드웨어 가속에 최적화되어 높은 프레임레이트 확보에 유리.
- 넓은 호환성: 전용 하드웨어가 없는 구형/저사양 GPU에서도 동작.
- 물리적 부정확성: 그림자, 반사 등이 근사치 계산으로 아티팩트 발생 가능 (예: SSR의 화면 밖 반사 불가).
- 복잡한 구현: 사실적인 효과를 위해 여러 트릭과 기법(Shadow Map, Cube Map 등)을 조합해야 함.
- 대부분의 게임: 특히 빠른 반응 속도가 중요한 FPS, 액션 장르.
- 스타일라이즈드 그래픽: 비사실적 렌더링 스타일에 적합.
- 모바일 및 저사양 PC 타겟.
레이 트레이싱 - 물리적 정확성: 빛의 동작을 시뮬레이션하여 매우 사실적인 이미지 생성.
- 단순하고 일관된 구현: 반사, 그림자 등을 하나의 원리로 통합 처리.
- 고품질 효과: 부드러운 그림자, 정확한 반사/굴절, GI 등 래스터로 어려운 효과를 쉽게 구현.
- 높은 연산 비용: 실시간으로 높은 품질을 얻기 위해 고사양 GPU 필요.
- 노이즈 문제: 실시간 구현 시 샘플 수 부족으로 디노이저가 필수적.
- 제한된 하드웨어: 전용 가속 코어가 있는 GPU에서만 실용적인 성능이 나옴.
- 시네마틱 렌더링: 영화, 애니메이션 등 오프라인 품질의 결과물이 필요할 때.
- 건축, 제품 시각화: 극사실적인 표현이 중요한 분야.
- AAA급 게임의 하이브리드 렌더링: 특정 효과(반사, 그림자 등)의 품질을 극대화하기 위해 사용.

언제 무엇을 사용해야 하는가?

  • 성능이 최우선이고 타겟 하드웨어가 다양하다면 래스터라이제이션을 기본으로 사용해야 합니다. 언리얼 엔진 5의 Lumen과 Nanite는 래스터라이제이션 기반에서도 매우 뛰어난 시각적 품질을 제공합니다.
  • 최고 수준의 사실성이 요구되고, 타겟 사용자가 고사양 PC를 보유하고 있을 것으로 예상된다면 하드웨어 레이 트레이싱을 활성화하여 그래픽 품질을 한 단계 끌어올릴 수 있습니다. 특히 반사가 많은 실내 환경이나 복잡한 조명 환경에서 그 효과가 극대화됩니다.
  • 오프라인 렌더링으로 최종 결과물만 얻으면 되는 경우, 언리얼 엔진의 패스 트레이서(Path Tracer)를 사용하는 것이 좋습니다. 패스 트레이서는 수백, 수천 개의 광선을 사용하여 노이즈 없는 영화 수준의 이미지를 생성하는 순수 레이 트레이싱 렌더러입니다.
iamrain
@iamrain :: Annals of Unreal

iamrain 님의 블로그 입니다.

공감하셨다면 ❤️ 구독도 환영합니다! 🤗

목차