모바일 GPU 아키텍처, 대부분 기본 Early Z 를 사용한다.
Early Z는 fragment shader의 실행을 줄이기 위한 수단으로 Rasterization 단계 이후에 발생한다.
Early-Z 알고리즘은 GPU가 셰이더를 실행하는 데 불필요한 노력을 낭비하기 전에 초기 깊이 검사를 수행하여 가려진 프래그먼트들을 제거함으로써 성능을 향상시킵니다.
Arm의 Mali GPU는 이것을 사용하고 PowerVR의 GPU도 사용하고 퀄컴의 Adreno GPU도 사용합니다.
Early Z 제거는 시야 위치에서 보이지 않는(가려진) 객체들의 불필요한 렌더 패스를 제거함으로써 빠른 은면 처리 방법을 제공합니다. Adreno GPU는 그려진 픽셀 채우기 속도의 최대 4배까지 가려진 픽셀들을 제거할 수 있습니다.
Adreno 문서
Early Z는 렌더링 파이프라인에서 픽셀 셰이더를 실행하기 전에 깊이(Depth) 테스트를 수행하는 최적화 기법이다. 이는 GPU 성능을 향상시키고 불필요한 픽셀 셰이더 작업을 줄여준다. 특히 모바일 하드웨어에서 Early Z는 전력 소비와 성능 최적화에 핵심적인 역할을 한다.
1. Early Z의 기본 원리
- Depth Test (깊이 테스트):
- 렌더링 중 각 픽셀의 카메라와의 거리를 비교하여 더 멀리 있는 픽셀을 제거한다.
- Early Z 처리:
- 픽셀 셰이더 실행 전에 깊이 테스트를 수행하여 보이지 않는 픽셀의 계산을 생략한다.
- 렌더링 순서:
- Early Z는 렌더링 순서(Front-to-Back)가 중요하며, 가까운 오브젝트부터 렌더링할수록 불필요한 계산을 더 많이 줄일 수 있다.
2. Early Z의 동작 단계
- Geometry 단계:
- 정점 셰이더 실행 후, 프레임 버퍼에 깊이 값을 기록한다.
- Depth Test 단계:
- GPU가 픽셀 셰이더 실행 전에 깊이 버퍼를 확인한다.
- 현재 픽셀이 이전 픽셀보다 더 멀리 있으면 해당 픽셀을 제거한다.
- Pixel 단계:
- 깊이 테스트를 통과한 픽셀만 픽셀 셰이더를 실행한다.
3. 모바일 하드웨어에서 Early Z의 중요성
모바일 GPU는 데스크톱 GPU와 달리 타일 기반 렌더링 방식을 주로 사용하며, Early Z는 이러한 모바일 환경에서 특히 중요한 역할을 한다.
3.1. 타일 기반 렌더링 (TBR)
- 모바일 GPU는 화면을 작은 타일로 나누어 각 타일을 개별적으로 렌더링한다.
- 각 타일의 깊이 정보를 메모리에 저장하고 Early Z와 결합하여 최적화한다.
3.2. 전력 소비 감소
- 불필요한 픽셀 셰이더 계산을 줄여 전력을 절약한다.
[전력 소비가 많은 경우]
픽셀 1 → 셰이더 연산 ⚡️
픽셀 2 → 셰이더 연산 ⚡️ → 높은 전력 소비
픽셀 3 → 셰이더 연산 ⚡️
[Early Z 사용 시]
픽셀 1 (보임) → 셰이더 연산 ⚡️
픽셀 2 (가려짐) → 연산 생략 ✓ → 전력 절약
픽셀 3 (가려짐) → 연산 생략 ✓
Early Z를 사용하면 불필요한 픽셀 셰이더 계산을 건너뛰어 전력을 절약할 수 있습니다. 이는 전력 제약이 큰 모바일 디바이스에서 특히 중요한 최적화 기법.
- 전력 제약이 큰 모바일 디바이스에서 Early Z는 필수적인 최적화 기법.
3.3. 메모리 대역폭 절약
- 깊이 테스트로 불필요한 픽셀 데이터를 제거하여 메모리 전송량을 줄인다.
- 메모리 대역폭이 제한적인 모바일 GPU에서 Early Z는 성능 향상에 크게 기여한다.
4. Early Z의 모바일 구현 방식
- Pre-Pass Z Testing:
- Z-Prepass로 모든 오브젝트의 깊이 값을 먼저 렌더링한다.
- 이후 색상 데이터를 계산한다.
Pre-Pass Z Testing의 동작 과정을 다음과 같이 도식화할 수 있다:
[1단계: Z-Prepass]
오브젝트 → 깊이값 렌더링 → 깊이 버퍼 저장
↓
[2단계: 색상 계산]
깊이 테스트 통과 픽셀만 → 색상 데이터 계산 → 최종 이미지
이 과정에서:
- 모든 오브젝트의 깊이 값을 먼저 렌더링하여 Z-buffer에 저장.
- 깊이 테스트를 통과한 픽셀에 대해서만 색상 데이터를 계산.
이를 통해 불필요한 픽셀 계산을 줄이고 메모리 대역폭을 절약할 수 있다.
- Hierarchical Z Buffer:
- GPU가 Z 버퍼를 계층적으로 관리하여 깊이 값을 빠르게 비교한다.
Hierarchical Z Buffer의 동작 방식을 다음과 같이 도식화할 수 있다:
[Z Buffer 계층 구조]
Level 0 (최상위) [ Max Z 값 ]
↑
Level 1 [Z값] [Z값]
↑ ↑
Level 2 [Z] [Z] [Z] [Z]
↑ ↑ ↑ ↑
픽셀 데이터 [세부 Z값들...]
[빠른 비교 프로세스]
1. 최상위 레벨부터 검사
2. 불필요한 영역 조기 제거
3. 필요한 부분만 하위 레벨 탐색
4. 최종 픽셀 Z값 비교
이 계층적 구조를 통해 GPU는 Z 버퍼를 효율적으로 관리하고 깊이 값을 빠르게 비교할 수 있습니다.
- Deferred Rendering:
- 모바일에서는 잘 사용되지 않으나, 일부 고성능 디바이스는 Early Z와 결합된 지연 렌더링 방식을 지원한다.
5. Early Z 최적화 팁
- 렌더링 순서 정렬:
- 가까운 오브젝트부터 렌더링하여 Early Z의 효과를 극대화한다.
- Overdraw 최소화:
- 복잡한 셰이더가 필요 없는 영역(예: 불투명 오브젝트)을 먼저 처리한다.
- Z-Prepass 활용:
- Geometry 단계에서 깊이 데이터를 먼저 렌더링한다.
- Alpha 테스트 회피:
- 알파 테스트는 Early Z의 효과를 저해하므로, 가급적 사용을 피하거나 Z-Write를 비활성화한다.
- ZWrite를 활성화하여 깊이 버퍼 기록을 보장
- 알파 테스트를 clip() 함수로 구현하여 깊이 값 처리를 최적화
Shader "Custom/EarlyZOptimized"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Cutoff ("Alpha Cutoff", Range(0, 1)) = 0.5
}
SubShader
{
Tags
{
"RenderType" = "TransparentCutout"
"Queue" = "AlphaTest"
"RenderPipeline" = "UniversalPipeline"
}
Pass
{
// Early-Z 최적화를 위해 ZWrite를 켜고, 알파 테스트 대신 clip 사용
ZWrite On
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
float2 uv : TEXCOORD0;
};
struct Varyings
{
float4 positionCS : SV_POSITION;
float2 uv : TEXCOORD0;
};
TEXTURE2D(_MainTex);
SAMPLER(sampler_MainTex);
float _Cutoff;
Varyings vert(Attributes input)
{
Varyings output;
output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
output.uv = input.uv;
return output;
}
half4 frag(Varyings input) : SV_Target
{
half4 color = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.uv);
// 알파 테스트 대신 clip 사용
clip(color.a - _Cutoff);
return color;
}
ENDHLSL
}
}
}
6. Early Z의 한계
- Alpha Blending 문제:
- 알파 블렌딩된 오브젝트는 깊이 값을 정확히 기록하지 못해 Early Z의 효과가 제한된다.
- 정렬 필요:
- Front-to-Back 렌더링이 필수적이므로 오브젝트 정렬에 추가 비용이 발생한다.
- 타일 메모리 제약:
- 타일 기반 GPU에서 과도하게 큰 타일 데이터는 Early Z의 성능을 제한할 수 있다.
Early Z는 모바일 GPU에서 불필요한 연산을 줄이고 성능과 전력 효율성을 극대화하는 핵심 기술이다. 특히 타일 기반 렌더링 방식의 모바일 하드웨어에서 Early Z는 메모리 대역폭 절약과 전력 소비 감소에 크게 기여한다. 이를 효과적으로 활용하려면 렌더링 순서를 최적화하고 알파 블렌딩을 적절히 관리해야 한다.
'GRAPHICS PROGRAMMING' 카테고리의 다른 글
VMF Diffuse: A Unified Rough Diffuse BRDF 간단 해석. (0) | 2025.01.17 |
---|---|
Bayer Matrix (0) | 2025.01.15 |
RHIDrawIndexedPrimitiveIndirect 또는 DrawMeshInstancedIndirect 와 GPU Buffer 개요. (0) | 2024.10.18 |
볼만 한 책들 (3) | 2024.10.16 |
GPU Driven with Fence & Barrier simple explanation (0) | 2024.08.10 |