렌더링 파이프라인은 CPU와 GPU의 자원을 사용하여 모델, 텍스처, 조명같은 3D 리소스들을 각각의 순차적인 과정을 통해 2D 이미지로 렌더링 하는 과정을 의미합니다.

언리얼 엔진에도 내부적으로 렌더링 파이프라인이 존재하며, 어떤 과정을 통해 이루어지는지에 대해 이번 포스팅을 통해 알아보겠습니다.

 

 

언리얼 엔진5 렌더링파이프라인 구조

 

 

 

Frame

렌더링을 시작하기 전에 이전 프레임과 현재 프레임 사이에 어떤 변화가 일어났는지 확인합니다.

CPU에서 동작하며, 마지막 프레임에서 일어난 모든 변화를 확인합니다.

다음 렌더링을 시작하기전에 모든 것을 진행하는 과정입니다.

※ 프레임 : 연속적인 영상을 구성하는 개별적인 정지 이미지

 

 

Visibility Processes / Occlusion Culling

가시성을 이용한 렌더링을 통해 게임 퍼포먼스 최적화를 담당하는 영역입니다.

카메라 Frustum에는 존재하지만, 씬 안에있는 다른 액터에 의해 가려져있거나 숨겨져있는 액터를 제외하여 성능을 향상시킵니다.

 ※ Culling : 보이지않는 지오메트리들을 렌더링에서 제외, 최적화하여 퍼포먼스를 향상시키는 기술

  • Distance Culling
    • 카메라와의 거리에 따라 렌더링 여부를 결정하는 기법
    • 설정한 거리외 오브젝트를 렌더링 하지 않음으로, GPU의 퍼포먼스 값을 향상시킬 수 있다.
    • 외부환경에서 내부환경으로 이동할 때 사용한다. (건물이나 구조물에 접근하기 전 내부가 보이지 않게)
  • Frustum Culling
    • 보이는 카메라 스페이스 밖의 Asset들을 렌더링 하지않는다.
    • 게임 내 POV값을 조절하는데 사용하며, Freeze Rendering명령어를 통해 확인할 수 있다.
  •  Precomputed Visibility
    • 가시성 데이터를 사전에 계산하여 런타임 환경에서 Occlusion Culling의 실시간 부하를 줄이는 기법
    • 화면에 표시할 필요가 없는 오브젝트들을 미리 계산하여 해당 레벨에서 GPU와 CPU의 렌더링 부하를 감소시킨다.
    • 고정된 시점(탑뷰, 2.5D게임)의 경우에서 효율적으로 사용할 수 있다.
  • Nanite Culling
    • 언리얼5에서 추가된 기능
    • 대규모 Static Mesh들을 LOD 시스템을 자동으로 처리하여 폴리곤들을 효율적으로 렌더링하는 기법
    • Level의 모든 Mesh들을 로드가능한 작은 클러스터로 분해시키고 렌더링 할 필요가없는 데이터를 로드시키지 않는다.
    • Culling을 엔진에서 자동으로 처리한다. 별도의 LOD를 만들지 않아도 된다.
    • 애니메이션이나 Skeletal Mesh와 같은 동적 Mesh들은 지원하지 않는다.

Depth Pass

Frame, Visibility / Occlusion Culling을 통해 렌더링을 해야하는 대상들을 파악 후 렌더링을 하는 단계입니다.

  • 카메라의 시점에서 각 픽셀까지의 거리(Depth)를 계산하여 Depth Buffer(Z-Buffer)의 텍스처에 저장하는 렌더링 단계.
  • 화면의 각 픽셀들이 카메라에서 얼마나 떨어져 있는지에 대해 0.0 ~ 1.0의 정규화된 값으로 저장한다.

Buffer : 데이터를 효율적으로 전달하기위해 사용하는 메모리 영역

 

  • Early Z-Pass
    • 기본적으로 활성화 되어있는 Pass
    • Depth 데이터를 먼저 계산하고 저장하여, 이후 색상 및 셰이더 계산을 최적화 하는 단계
    • 가려진 오브젝트, 픽셀들은 실행하지 않는다.

 

 

Base Pass

  • 화면에 보이는 객체의 시각 정보를 카메라에 출력하기 위해 색상, 재질, 조명 정보를 계산하는 단계
  • Base Color(색상), Roughness(표면의 거침 정도), Metalness(금속성), Specular(반사율)등을 G-Buffer에 저장한다. 
  • Direct Lighting(직접 조명), Indirect Lighting(간접 조명)으로 나누어 계산, G-Buffer에 저장한다.
    • G-Buffer에 저장된 조명 값들은 Lighting Pass에서 처리한다. 
  • UV좌표를 기반으로 텍스처 데이터를 불러온다.
  • Texture의 복잡성을 낮추거나, 해상도를 조절하여 GPU 부하를 감소시키는 단계

 

Static Lighting

  • 빌드시 Static Lighting 데이터를 생성한다.
  • CPU 기반으로 실행되며, 반사, 그림자 등 정적 조명 효과를 계산한다.
  • 정적 객체 및 조명에만 적용되며, 빌드 시 많은 계산을 요구하므로 Scene이 복잡할수록 빌드 시간이 길어진다.
  • Static 객체, 조명을 배치, UV값 설정, 빌드를 담당한다.

 

Dynamic Lighting

  • 조명과 객체들의 그림자, 반사, 색상 변화들을 실시간으로 처리한다.
  • 동적, 정적 객체에 실시간으로 조명을 적용, 처리한다.
  • 낮-밤의 전환, 폭발등의 동적인 환경을 담당한다.
  • 런타임 환경에서 계산되어 GPU,CPU를 많이 사용하여 성능에 문제가 발생할 수 있다.
  • Capsule Shadows : 스켈레탈 메시의 그림자를 가장 단순하게 처리하여 보여준다.
  • Raytracing : 정확하게 렌더링된 프레임에 가장 가까운 결과물을 실시간으로 제공한다.
  • Virtual Shadow Maps : 화면 크기에 따라 다른 해상도로 렌더링, 정확히 필요한 곳에서 높은 디테일 확보, 멀어질수록 최적화 하기위한 낮은 해상도로 예비 전환하는 역할

 

 

Reflections

  • 빛이 물체 표면에서 반사되어 다른 물체로 전달되는 시각적 효과를 표현한다.
  • 물, 유리, 금속 등 반사 특성이 강한 표면을 표현하거나 거울에 비친 캐릭터 등에 활용한다.
  • Screen Space Reflection
    • 화면에 보이는 정보들을 기반으로 런타임 환경에서 반사값들을 계산하여 처리한다.
  • Lumen 
    • Ray Tracing를 사용하여 실시간으로 전역 조명과 함께 반사값을 계산, 처리한다.
    • 씬의 복잡성과 관계없이 최적화된 성능을 제공한다.

 

Additional Features, Post Processing

  • 렌더링 파이프라인에서 기본적인 렌더링 처리 외 더 세부적인 효과를 처리하는 단계
  • Particle Effects, Bloom, Depth of Field 등의 기능들이 있다.
  • 렌더링 파이프라인의 후처리를 통해 시각적 퀄리티를 향상시킨다.
  • Post Processing이 D3DX 렌더링파이프라인의 Output Meger의 역할을 담당한다.

 

Performance

  • 다양한 방식으로 씬을 최적화하거나, 다른 씬보다 비용이 많이 드는 씬을 실시간으로 확인하는 단계
  • 성능에 문제가 되는 렌더링들을 모니터링 및 트러블슈팅을 확인할 수 있다.

Scalability Example

  • 프로젝트 한가지 버전 빌드시 나머지 지원 플랫폼으로도 사용할 수 있게 처리하는 단계
  • 저사양 모바일부터 차세대 플랫폼들에 대해 엔진에서 다양한 파라미터들을 확인, 수정할 수 있다.

Unreal Engine5 - Render : https://dev.epicgames.com/community/learning/tutorials/7BY6/unreal-engine-7eb4ec?source=Jke

 

Visibility and Occlusion Cuilling : https://dev.epicgames.com/documentation/ko-kr/unreal-engine/visibility-and-occlusion-culling-in-unreal-engine

 

 

 

개발자가 되기위해서는 자신이 원하는 직업의 방향성에 맞는 C++, C#, Java와같은 다양한 언어를 학습하게됩니다.

저는 게임 클라이언트 개발자를 지향하는 개발자로써 가장 많이 알려져있는 프로그래밍 언어 중 C++를 학습하게 되었으며, C++을 통한 상용화된 엔진 중 가장 대중적으로 알려져있는 Unreal엔진을 학습하게 되었습니다.

이번 포스팅에서는 언리얼 엔진의 특징 및 장단점, 그리고 언리얼5에서 변경된 특징등에 대해 알아보겠습니다.

 

Unreal 엔진이란?

언리얼 엔진은 에픽게임즈에서 개발한 게임엔진으로, 다양한 플랫폼에서 사용되며 고사양 그래픽 렌더링, 블루프린트,

오픈 소스 및 마켓플레이스를 통한 다양한 에셋 등의 특징이 있습니다.

 

  • 특징 및 장점 : 
    • 블루프린트를 사용한 시각적 스크립팅이 가능하여 테스트 및 비 개발자들과의 협업이 용이하다.
    • PC,콘솔,모바일 등 다양한 플랫폼환경에서 게임 개발이 가능하다.
    • 오픈 소스 코드로 개발자가 필요에 따라 엔진을 직접 수정 및 최적화가 가능하다.
    • 상용화된 엔진을 통해 많은 커뮤니티가 활성화 되어있으며, 듀토리얼 및 문서를 통해 다양한 학습이 가능하다.
    • C++에서는 없던 GC(Garbage Collection)이 존재하여 효율적인 메모리 관리가 가능하다.
  • 단점 :
    • 개발 환경에서 유니티 엔진에 비해 고사양의 PC가 필요하다.
    • 모바일 게임 개발은 가능하지만, 최적화 및 저사양의 스마트폰에서는 성능 문제가 발생할 수 있다.
    • 초기 접근의 어려움이 있다.

 

Unreal vs Unity

언리얼 VS 유니티 비교

 

 

엔진이 무겁다?

  1. 개발 환경 하드웨어 자체 의미
    • CPU,GPU,RAM 요구사항이 높다
      • 고해상도 그래픽, 쉐이더 기술의 적용되는 기능들
  2. 엔진의 크기 및 컴파일 시간이 높다.
    • 유니티는 모듈식, 언리얼은 추가설정 하지 않아도 적용되는 기술들이 많다
    • 언리얼은 기본적으로 제공하는 기능들이 많은 이유가 엔진이 무겁다는 의미 + 초기 접근시 높은 난이도를 요구한다.
  3. 런타임 환경에서 리소스 사용량이 높다.
    • AAA급 게임을 만들기 적합한 이유 (루멘, 피직스 시뮬레이션 등)을 사용한 렌더링의 이유
    • 유니티는 유연함을 중점, 최적화를 중점으로 하고있다.
  4. 엔진의 복잡성
    • 언리얼 엔진은 C++기반, 유니티 엔진은 C#기반으로 설계
    • C++의 특징인 기계어에 가깝다. 즉, 더 낮은 수준까지 접근을 허용한다.
  5. 의존성 차이
    • 유니티 : 유연하다 → 모듈식으로 필요한 기능들만 추가/제거한다.
    • 언리얼 : Material, 시퀀스, 블루프린트등의 편리한 기능들을 기본적으로 제공한다.

 

 

그래픽 렌더링의 차이

  1. 좀더 사실적 그래픽(고 해상도 그래픽)렌더링을 목표로 하기때문.
    • 회사의 방향성이 다르다.
    • 나노이트, 루멘, 쉐이딩시 매터리얼 에디터등의 추가 기능이 통합되어 있다.
    • 유니티의 경우 원하는 기능들을 추가/제거하는 모듈화된 패키지 형식, 유니티에서도 HDRP를 통한 고품질 포스트 프로세싱 가능
  2. 같은 HLSL을 통한 셰이딩을 할시 어떤 결과?
    • 렌더링 파이프라인의 차이가 있다.
      • 언리얼 : 고해상도 품질 위주
      • 유니티 : 퍼포먼스 위주, HDRP를 설정 시 고품질 그래픽 렌더링 가능
    • 포스트 프로세싱의 차이
      • 언리얼 : Bloom, Depth of Field, Motion Blur, Anti-Aliasing 등 기본적으로 제공
      • 유니티 : 어느정도 포스트 프로세싱이 가능하지만, 기본 설정값에는 최소화 되어있다. → 기본설정+개발환경 설정을 통한 유연함을 강조
    • 라이트
      • 언리얼5 특징인 루멘과 같은 기술이 적용되어 조명 시스템의 차이가 있다.

 

언리얼5에서 추가된 주요 특징

언리얼4 엔진에서 5로 변경되며 추가된 강력하고 다양한 특징들이 있지만, 그 중 클라이언트 개발자가 알아야 되는 몇가지 특징들에 대해 알아보겠습니다.

 

1. 나노이트(Nanite)

  • 가상화된 마이크로폴리곤 지오메트리 시스템으로, 매우 높은 디테일의 모델을 실시간으로 렌더링 할 수 있다.
  • 복잡한 모델에서도 디테일 손실 없이 높은 성능 유지가 가능하다.
  • LOD(Level of Detail) 작업이 자동으로 처리되며, 개발 시간을 단축시켜준다.
  • 거대한 오픈월드 환경 및 건축 시각화에서 사용할 수 있다.

2. 루멘(Lumen)

  • 다이나믹 글로벌 일루미네이션 솔루션으로 직접광 또는 지오메트리(Geometry Shader)와 같은 변화에 따른 간접광을 즉시 반영한다.
  • 환경변화에 따라 실시간으로 조명과 그림자가 자동으로 조정된다.
  • 별도의 라이트맵이 필요없이 자연스러운 조명 구현이 가능하다.

3. 월드 파티션(World Partition)

  • 월드를 언리얼 엔진이 담당하여 나누어 관리하는 데이터 스트리밍 시스템이다.
  •   액터당 한 개의 파일(One File Per Actor, OFPA)시스템을 통해 여러 개발자가 동일한 월드의 같은 영역을 동시에 작업 할 수 있다.
  • 대규모 오픈월드를 언리얼엔진 내부에서 담당하여 효율적으로 제작 및 관리가 가능하다.
  • 사용자(유저)는 필요한 부분만 로드하여 메모리 사용을 절감할 수 있다.

4. 메타사운드(Meta Sound)

  • 사운드 소스의 오디오 DSP 그래프 생성을 제어하는 시스템.
  • 오디오 렌더링의 모든 측면을 관리할 수 있다.
  • 프로그래밍이 가능한 매터리얼 및 렌더링 파이프라인과 유사하다.

이번 포스팅에서는 언리얼 엔진의 특징 및 장단점, 그리고 언리얼5의 주요 추가된 기능들에 대해서 알아보았습니다.

이 외에도 언리얼 엔진은 클라이언트 개발자가 개발시 다양한 도움을 주며, 그 중 객체의 생성과 소멸을 언리얼 엔진 내부에서 담당하여 개발자에게 편리함을 주는 기능 중 하나인 GC에 대해 알아보겠습니다.

+ Recent posts