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 |
