글에 문제가 있는걸 본다면, 수정할 수 있게 댓글로 말씀 부탁드립니다.
게임개발관련에서 최적화 관련 이야기를 할 때, 꼭 나오는 말이 DrawCall이다.
이 글에서 직접 공부한 DrawCall를 적어볼려고 한다.
DrawCall은 CPU가 GPU에게 화면에 그림을 그리는걸 명령하는걸 말한다.
화면에 무언가를 많이 그려서 문제가 생기는게 아니라. 이 그리라고 명령 내리는 수가 많은 것이 문제인 것이다.
즉 핵심은 "렌더링 명령 호출 횟수(Draw Call 수)를 줄이는 것"이고, 단순히 그리는 개수를 줄이는 게 아니라 어떻게 묶어서 효율적으로 처리할지가 중요하다.
물론 그리는 과정도 효율적으로 잡아야하는 것이 맞지만, 아트 작업물의 퀄리티를 건들 수도 있기에
먼저 퀄리티를 건들지 않는 드로우콜부터 잡는 것이 맞다.
다음과 같이 예시로 드로우콜을 이해했다.
- 나쁜 예시: 나무 100개를 각각 100번의 Draw Call로 렌더링
- 좋은 예시: 나무 100개를 Instancing을 사용해 1번의 Draw Call로 처리
아래부터는 상세 내용으로 들어간다.

- DP Call (Draw Primitive)
DPcall은 실제 드로우콜이 실행되는 단계입니다. GPU에게 렌더링할 객체나 프리미티브(점, 선, 삼각형 등)에 대한 정보를 전달합니다. 여기서 정의되는 주요 사항은 Mesh 데이터로 버텍스, 인덱스, 노멀, UV 등 GPU에 전달하는 과정입니다.
-Transform(MVP)
MVP는 Model-View-Projection의 약자로 3D 공간에서 객체를 화면에 올바르게 렌더링하기 위한 변환 행렬입니다.
WVP(World-View-Projection)와 실제 렌더링에서 큰 차이 없이 동일 취급한다.
월드->카메라->화면 좌표계로 변환하는 과정이 담긴다. 이를 통해 3D공간의 오브젝트가 2D공간의 화면으로 그려지는 것이다.
-Set Texture
텍스처는 객체에 입혀지는 2D 이미지입니다. Set Texture 단계에서는 GPU에 사용할 텍스처를 바인딩한다.
여기서 주로 해야 할 일은 텍스처 객체를 셰이더와 연동시키는 작업이다.
예를 들어, Diffuse Texture, Normal Map, Specular Map 등을 각기 다른 텍스처 슬롯에 바인딩합니다.
핵심은 텍스쳐의 변경사항이 들어가면 한번 더 Call이 생긴다는 점이 존재하며,
텍스처가 많아지면 메모리 전송 비용 증가 → 따라서 텍스처 배칭(Texture Atlas) 기법을 사용하기도 함.
컬러값을 활용해 압축하는것도 방법이다. 그레이스케일 맵이라면 RGBA의 각 채널로 분리해서 넣고 그걸 다시 아틀라스화를 하면
텍스쳐는 최적화가 된다.
RMSA - Roughness, Metallic, Specular, Ambient Occlusion가 예시안이다.
-Shader Constant
Shader Constant는 쉐이더에 전달할 상수값이나 데이터를 설정하는 단계입니다. 이러한 값들은 쉐이더의 실행 과정에서 사용되며, 보통 **상수 버퍼(Constant Buffer)**로 전달한다.
예를 들어, 빛의 세기, 색상, 카메라 위치, 텍스처 좌표 범위와 같은 데이터를 셰이더에 전달해야 할 때 이 단계에서 해당 값을 셰이더의 유효한 변수에 설정한다.
-Blending State
Blending State는 렌더링된 픽셀의 색상을 기존 화면의 색상과 어떻게 합성할지 정의하는 상태입니다. 이 단계에서는 알파 블렌딩, 애드 블렌딩, 디스커드 블렌딩 등 다양한 블렌딩 모드를 설정한다.
언리얼 엔진에서 머티리얼의 블렌드 모드는 Blending State를 설정하는 것과 동일한 역할을 한다.

커맨드 버퍼 단계 | 설명 | 관련 렌더 상태(Render States) |
DP Call (Draw Primitive) | GPU에 삼각형을 그리라고 명령 | Mesh, Primitive Type (Triangle List 등) |
Transform (MVP) | 모델 좌표를 화면 좌표로 변환 | MVP 행렬, Vertex Shader |
Set Texture | 셰이더에 사용할 텍스처 지정 | Texture, Sampler State, UV |
Shader Constant | 셰이더에 필요한 데이터 전달 | 조명 정보, 머티리얼 속성 등 |
Blending State | 픽셀 연산 & 기존 화면과 합성 | Blend Mode (Alpha, Addtive 등) |
📌 추가적으로 고려해야 할 요소
1. 렌더링 최적화
- 드로우 콜이 많아질수록 CPU 부하 증가 → Draw Call Batch 기법 사용
- Instancing (인스턴싱), Merge Mesh (메시 합치기) 등도 성능 최적화에 활용
2. Depth Test & Stencil Test
- 커맨드 버퍼에는 깊이 테스트(Depth Test)와 스텐실 테스트(Stencil Test) 같은 상태도 포함됨
- Z-Buffer를 활용하여 픽셀의 가려짐(Occlusion) 여부를 체크
GPU는 화면을 그릴 때 "어떤 픽셀이 앞에 있고, 어떤 픽셀이 뒤에 있는지"를 판단해야 함.
이를 위해 Z-Buffer(깊이 버퍼)를 사용하여 현재 픽셀이 기존 픽셀보다 앞인지 뒤인지 비교함.
만약 새로운 픽셀이 기존 픽셀보다 뒤에 있다면, 기존 픽셀을 유지하고 새로운 픽셀을 그리지 않음 → 이를 Depth Test라고 함.
Stencil Test는 Depth Test와 비슷하지만, 특정 마스크(값)를 사용하여 픽셀을 더 정밀하게 선택 가능보통 특정 오브젝트만 렌더링하거나, UI 요소를 제외하는 용도로 사용됨. FPS 게임에서 스코프 조준경 효과가 좋은 예시이다.
3. Multi-pass Rendering - ( 여러 번의 드로우 콜을 사용하여 원하는 효과를 구현하는 기법)
사용처 | 설명 | 후처리(Post-Processing)? |
Deferred Rendering | G-Buffer에 여러 번 렌더링하여 조명 계산을 후처리로 수행 | ✅ 관련 있음 |
Shadow Mapping | 그림자를 만들기 위해 먼저 깊이 맵을 렌더링 | ❌ |
SSR(Screen Space Reflection) | 화면의 픽셀을 기반으로 반사 효과를 계산 | ✅ |
Multi-pass Shader | 한 오브젝트에 여러 개의 셰이더 패스를 적용 (예: Outline 효과) | ❌ |
Transparency Sorting | 반투명 오브젝트를 올바르게 그리기 위해 여러 번 정렬하여 렌더링 | ❌ |
후처리와 관계 ✅
1. Deferred Rendering
- 첫 번째 패스: G-Buffer에 색상, 노멀, 깊이 정보를 렌더링
- 두 번째 패스 이후: 저장된 G-Buffer를 이용하여 조명을 계산
2. Bloom, HDR, Motion Blur, SSAO
- 첫 번째 패스: 원본 씬을 렌더링
- 두 번째 패스: 후처리 필터를 적용하여 효과 추가
3. Post-Processing Shader
- 화면 전체에 필터(블러, 톤 맵핑 등)를 적용할 때 여러 번 패스를 수행
후처리와 관계 ❌ - 렌더링 자체에서 Multi-pass Rendering을 활용하는 경우
1. Shadow Mapping → 렌더링 과정!
- 첫 번째 패스: 빛의 시점에서 깊이 맵 생성
- 두 번째 패스: 깊이 맵을 기반으로 그림자 적용
2. Multiple Light Passes (Forward Rendering) → 실시간 조명 계산!
- 각광(Per Light) 방식으로 여러 개의 조명을 처리할 때, 조명마다 별도로 렌더링
3. Transparency Rendering(반투명 렌더링) → 렌더링 순서 문제!
- 반투명 오브젝트는 깊이 정렬을 해야 올바르게 표현됨
- 앞쪽 오브젝트부터 차례로 여러 번 그려야 함
언리얼 블렌드 모드 & 드로우콜 개수 [재정렬의 유무에 따른 변화를 주목하자]
블렌드모드 | 배경합성 | 마스크 | 드로우콜 | 비고 |
Opaque | ❌ | ❌ |
1개 | 불투명한 표면, 추가적인 계산 없음. |
Masked | ❌ | ✅ | 1개 | 이진[0or1] 알파마스크 값 |
Translucent | ✅ | ❌ |
2개 이상 (Z-Sorting) |
0~1 사이 알파 값 사용, 깊이 순서 필요. |
Addtive | ✅ | ❌ | 1개 겹치면 흰색이되는 가산방식 |
소스 색을 배경에 추가, 합 연산을 사용함 빛나는 효과에 사용. |
Modulate | ✅ | ❌ |
1개 겹치면 흑색이되는 변조방식 |
소스 색을 배경에 추가, 곱 연산을 사용함 빛나는 효과에 사용. |
AlphaComposite | ✅ | ❌ | 2개 알파 합성시 여러 단계 필요 |
더 정확한 알파 합성, 복잡한 색 합성 처리 |
Alphaholdout | ❌ | ✅ | 1개 (배경과 합성되지 않음) |
배경을 그대로 보여주는 방식 Z-Sorting 필요없음. |
위 표가 정확하지 않을 수 있지만, 핵심으로 정리하면 재연산 유무들을 정리했다.
- Base Color : 1개 드로우콜, Emissive 1개 드로우콜, Opacity 및 Z-sorting : 1개 드로우콜, Refraction(굴절): 1개, clearcoat 1개, Two-Sided : 1개
- Base Color+Specular+Roughness+Metallic+AmbientOcclusion+Normal = 1개
📌 결론
- 커맨드 버퍼는 렌더링 명령을 순서대로 실행하는 GPU의 작업 리스트
- Render States는 GPU가 각 단계에서 사용할 셰이더, 메시, 텍스처 등의 정보 포함
- 커맨드 버퍼와 렌더 상태는 1:1로 연결되며, 단계별로 GPU가 필요한 설정을 변경하면서 수행됨
- 최적화를 위해 드로우 콜을 줄이고, 텍스처 전송 비용을 낮추는 것이 중요함
'Unreal > Unreal_Material' 카테고리의 다른 글
포스트프로세싱 픽셀레이션 및 색상변경 (0) | 2025.03.25 |
---|---|
나이아가라와 머티리얼의 변수 제어하는 방법들 (0) | 2025.02.12 |
Curve Atlas에 관해서 (1) | 2025.01.05 |
SubUV_Function 사용법 (2) | 2024.11.29 |
진폭 그래프 (1) | 2024.11.09 |