Microsoft의 Windows/Xbox 전용 그래픽스 API. DX11, DX12가 현재 주력. UE5는 DX12를 기본으로 사용.

 

DirectX = Microsoft의 멀티미디어 API 묶음

Direct3D -> 3D 그래픽스  <- 게임 개발자가 주로 다루는 것

DirectSound -> 오디오

DirectInput -> 입력 장치

DirectPlay -> 네트워크

DXGI -> 디스플레이 관리

 

게임의 DirectX는 대부분 Direct3D를 의미한다

 

DX11 vs DX12

 

DX11

-> 드라이버가 많이 처리

-> 암묵적 리소스 관리

-> 단일 스레드 렌더링

-> CPU 오버헤드가 큼

-> 배우기 쉬움

-> UE4 기본

 

DX12

-> 개발자가 직접 처리

-> 명시적 리소스 관리

-> 멀티스레드 렌더링 가능

-> CPU 오버헤드가 작음

-> 복잡하지만 성능 높음

-> UE5 기본

 

DX12가 무조건 좋은건 아니다. 복잡성 대가로 성능을 얻은 것이기에 프로젝트 규모나 퀄리티에 따라 DX11이 더 효율적인 경우도 있음

 

DX12의 핵심 개념들 ( 왜 복잡한가 )

DX12가 복잡한 이유는 드라이버가 해주던 것들을 개발자가 직접 해야함.

 

커맨드 리스트 (Command List) : 렌더링 명령을 CPU에서 기록하는 버퍼

커맨드 큐 (Command Queue) : GPU에 제출하는 채널

디스크립터 힙 (Descriptor Heap) : GPU 리소스(텍스처, 버퍼)의 주소록

리소스 배리어 (Resource Barrier) : 리소스 상태 전환을 개발자가 명시적 관리

PSO (Pipeline State Object) : 셰이더 + 렌더 상태를 한 번에 묶어 관리

 

UE5와 DirectX 관계

 

UE5 코드 ( C++ ) -> RHI ( Rendering Hardware Interface ) : UE5의 그래픽스 API 추상화 레이어 -> 

D3D12RHI (Windows), VulkanRHI(Android/Linux), MetalRHI(iOS/Mac), OpenGLRHI(레거시) ->

GPU 드라이버 -> GPU 하드웨어

 

요약 : UE5에서 머티리얼을 수정하면 HLSL이 컴파일되고, RHI를 통해 DX12 커맨드로 변환되어 GPU에서 실행된다.

 

DX11 vs DX12 내부 동작

// DX11 방식 - 드라이버가 자동 처리
deviceContext->DrawIndexed(indexCount, 0, 0);
// 내부에서 드라이버가
// - 리소스 추적, 동기화 처리, 상태 검증을 다 해줌 -> CPU 오버헤드 발생

// DX12 방식 - 개발자가 직접 처리
// 1. 커맨드 리스트에 직접 기록
commandList->DrawIndexedInstanced(indexCount, 1, 0, 0, 0);

// 2. 리소스 상태를 개발자가 직접 전환
D3D12_RESOURCE_BARRIER barrier = {};
barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
barrier.Transition.pResource = texture;
barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COMMON;
barrier.Transition.StatetAfter = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
commandList->ResourceBarrier(1, &barrier);

3. GPU에 제출
commandQueue->ExecuteCommandLists(1, &commandList);

// CPU 오버헤드 거의 없음 -> 멀티스레드로 커맨드 리스트 병렬 구성 가능

 

HLSL : DX의 셰이더 언어

// 버텍스 셰이더
cbuffer TransformBuffer : register(b0)
{
    matrix Model; // uniform 변수 (OpenGL) = cbuffer (DX)
    matrix View;
    matrix Projection;
};

struct VertexInput
{
    float3 Position : POSITION; // 시맨틱 - GLSL과의 차이
    float2 TexCoord : TEXCOORD0;
};

struct PixelInput
{
    float4 Position : SV_POSITION;
    float2 TexCoord : TEXCOORD0;
};

PixelInput VS(VertexInput input)
{
    PixelInput output;
    float4 worldPos = mul(float4(input.Position, 1.0), Model);
    float4 viewPos = mul(worldPos, View);
    output.Position = mul(viewPos, Projection);
    output.TexCoord = input.TexCoord;
    return output;
}

// 픽셀 셰이더
Texture2D DiffuseMap : register(t0);
SamplerState Sampler : register(s0);

float4 PS(PixelInput input) : SV_TARGET
{
   return DiffuseMap.Sample(Sampler, input.TexCoord);
    // UE5 TextureSample 노드
}

GLSL과 가장 큰 차이는 시맨틱(Semantic)이다. POSITION, TexCoord0, SV_TARGET 같은 키워드로 각 변수의 용도 명시

 

UE5에서 DX12가 실제로 어떻게 쓰이는가

 

Nanite 렌더링

-> DX12 Mesh Shader 활용

-> 폴리곤을 GPU에서 직접 처리

 

Lumen GI

-> DX12 Ray Tracing (DXR)

-> 소프트웨어 레이 트레이싱 + 하드웨어 옵션

 

PSO 캐싱

-> DX12 Pipeline State Object

-> 첫 실행 시 셰이더 컴파일 후 캐싱

-> 이후 빠른 로드

 

멀티스레드 렌더링

-> DX12 커맨드 리스트를 여러 스레드에서 병렬 구성

-> RenderThread + RHIThread로 분리

 

연결되는 단어들

DXGI (DirectX Graphics Infrastructure) : 디스플레이 출력, 스왑체인, 모니터 관리를 담당. DX12와 함께 사용. 프레임을 화면에 표시하는 마지막 단계

 

스왑체인(Swap Chain) : 화면에 표시하는 버퍼와 다음 프레임을 그리는 버퍼를 교대로 사용하는 구조. 더블/트리플 버퍼링의 기반.

 

DXR(DirectX Raytracing) : DX12에 추가된 하드웨어 레이 트레이싱 API. RTX GPU에서 가속. UE5 Lumen의 하드웨어 레이

트레이싱 모드

 

PIX : Microsoft의 DX 디버깅/프로파일링 도구. GPU 프레임 캡처, 셰이더 디버깅, 성능 분석. RnderDoc의 Windows/DX 특화

버전

'Word' 카테고리의 다른 글

Metal  (0) 2026.07.10
Vulkan  (0) 2026.07.09
OpenGL ( Open Graphics Library )  (0) 2026.07.07
스마트 포인터 ( Smart Pointer )  (0) 2026.07.06
SOLID 원칙  (0) 2026.07.06

+ Recent posts