SSAO와 GTAO의 렌더링 비용 특성 및 모바일 AO 최적화 선택지
스크린 스페이스 앰비언트 오클루전(SSAO)과 그라운드 트루스 앰비언트 오클루전(GTAO)의 원리와 비용 변수를 개괄하고, 모바일 환경에서 비교해 볼 AO 최적화 선택지를 소개합니다.

핵심 요약
- SSAO(Screen Space Ambient Occlusion)의 샘플링 방식과 필터 비용은 구현에 따라 다릅니다. 전통적인 무작위 샘플링 방식은 노이즈를 줄이기 위한 필터 패스가 필요할 수 있습니다.
- GTAO(Ground Truth Ambient Occlusion)는 화면 공간에서 지평선 각도를 탐색하고 코사인 가중 적분을 근사합니다. 텍스처 탭과 ALU 비용은 구현·품질 설정에 따라 달라지므로 실제 장면에서 비교해야 합니다.
- 타일 기반 모바일 GPU에서는 화면 공간 AO의 깊이·노멀 접근과 추가 렌더 패스가 외부 메모리 대역폭을 늘릴 수 있습니다. 비용을 측정한 뒤 정적 오브젝트에는 버텍스 AO나 라이트맵 베이킹, 동적 오브젝트에는 캡슐/프록시 AO, 필요하면 하프 해상도 업샘플링을 검토합니다.
앰비언트 오클루전(AO)의 수학적 원리와 스크린 공간 근사
앰비언트 오클루전(Ambient Occlusion, AO)은 표면점에서 주변 반구 방향의 가시성을 적분해 주변광의 차폐를 근사하는 렌더링 기법입니다. AO는 글로벌 일루미네이션(GI)을 대체하지 않지만, 간접광의 가림을 단순화한 음영 정보로 접합부와 접지감을 표현하는 데 도움을 줄 수 있습니다.
표면의 한 점 에서 단위 법선 벡터 을 기준으로 한 반구(Hemisphere) 영역 의 접근도(Accessibility)는 다음과 같이 쓸 수 있습니다. 여기서는 도 단위 방향 벡터이며, 완전히 열린 반구의 값은 1입니다.
- : 방향 로의 가시성 함수(Visibility Function, 차폐되면 0, 열려있으면 1)
- : 램버트 코사인 가중치(Lambertian Cosine Weight)
- : 해당 지점의 접근도(Accessibility, 0에 가까울수록 가려지고 1에 가까울수록 열려 있음)

실시간 렌더링의 한 근사 방식인 스크린 스페이스(Screen-Space) AO는 카메라에 렌더링된 뎁스 버퍼(Depth Buffer)를 표본화해 가림을 추정하며, 구현에 따라 노멀 버퍼(Normal Buffer)도 사용합니다. 이 방식은 화면에 보이지 않는 기하 정보를 직접 평가하지 않으므로 전체 장면의 레이 트레이싱과 같은 결과를 보장하지 않습니다.
SSAO와 GTAO는 어떤 원리로 동작하며 연산 비용 차이는 왜 발생하는가?
1. SSAO (Screen Space Ambient Occlusion)
SSAO는 2007년 Crytek의 SIGGRAPH 강연을 통해 널리 알려졌습니다. 초기 계열 구현은 픽셀 주변 3차원 구(Sphere)에서 표본을 취했고, 이후 구현은 표면 법선 기준 반구(Hemisphere)를 사용하기도 합니다. 표본 수와 분포는 구현마다 다릅니다. 표본 위치를 화면 공간으로 투영한 뒤 뎁스 버퍼의 깊이와 비교해 주변 가림을 추정합니다.
- 장점: 단순한 기본 구현을 만들기 쉽고 품질 설정을 조절하기 쉽습니다.
- 주의점: 샘플 수가 적거나 분포가 거칠면 노이즈와 밴딩이 나타날 수 있어 공간·시간 필터를 추가하기도 합니다. 깊이 편향이나 법선 처리가 부정확하면 평면에서 셀프 오클루전이 생기거나 접촉부가 부자연스러워질 수 있습니다.
2. GTAO (Ground Truth Ambient Occlusion)
Jorge Jimenez, Xian-Chun Wu, Angelo Pesce, Adrian Jarabo가 2016년에 발표한 GTAO는 화면 공간 여러 방향의 슬라이스(Slice)마다 지평선 각도 를 구해 가시성을 근사합니다. 여기서 는 슬라이스의 화면상 방향이고 는 표면 법선과 시선 사이의 각도입니다. 논문은 코사인 가중 적분을 정의하고, 슬라이스 내부 적분은 해석적으로 계산하며 방향 적분은 수치적으로 계산합니다.
- 장점: GTAO 논문은 멀티바운스 근사로 단일 차폐 계산에서 빠지는 근거리 간접광 에너지를 보정하는 방식을 제안합니다.
- 주의점: 슬라이스 수, 탐색 단계, 필터에 따라 텍스처 읽기와 ALU 비용이 달라집니다. 삼각함수나 보조 필터가 들어가는 구현도 있으므로 같은 해상도와 품질 목표에서 측정해야 합니다.
flowchart TD
A["Depth & Normal Buffer"] --> B{"AO 알고리즘 선택"}
subgraph SSAO_Pipeline ["SSAO 파이프라인"]
B -->|"반구 샘플링"| C["3D Hemisphere Sample (sample count varies)"]
C --> D["깊이 비교 & 가중치 합산"]
D --> E["선택적 노이즈 필터"]
end
subgraph GTAO_Pipeline ["GTAO 파이프라인"]
B -->|"화면 분할 방향 탐색"| F["Screen-Space Horizon Search (implementation-dependent)"]
F --> G["물리적 Closed-form 적분 & Multi-bounce"]
G --> H["Spatial Filter & Temporal Denoiser"]
end
E --> I["최종 라이팅 합성"]
H --> I
3. SSAO vs GTAO 비용 구조 비교 표
| 비교 항목 | SSAO (Classic) | GTAO (Jimenez et al.) |
|---|---|---|
| 샘플링 전략 | 3D 구/반구 무작위 오프셋 샘플링 | 2D 스크린 스페이스 다방향 Horizon 탐색 |
| 텍스처 탭(Texture Taps) | 샘플 수와 해상도에 따라 다름 | 슬라이스·탐색 단계와 해상도에 따라 다름 |
| ALU 복잡도 | 깊이 비교와 가중치 합산 중심 | horizon 탐색과 적분·필터 구현에 따라 다름 |
| 메모리 대역폭 요구량 | 패턴과 렌더 패스 구성에 따라 다름 | 패턴과 렌더 패스 구성에 따라 다름 |
| 블러/필터링 의존도 | 노이즈와 밴딩에 따라 필터 추가 가능 | 시간·공간 필터 사용 여부가 구현별로 다름 |
| 화면 접촉부 정밀도 | 편향과 샘플링 설정에 따라 달라짐 | horizon 근사와 필터 설정에 따라 달라짐 |
| PC/콘솔 기준 권장 여부 | 목표 화질·성능에 맞춰 장면별 비교 | 목표 화질·성능에 맞춰 장면별 비교 |

타일 기반 지연 렌더링(TBDR) 모바일 GPU에서 스크린 스페이스 AO 비용을 확인해야 하는 이유는 무엇인가?
일부 스마트폰·모바일 GPU는 타일 기반 렌더링 아키텍처를 사용합니다. 이 환경에서 포스트 프로세스 기반 스크린 스페이스 AO는 구현에 따라 추가 메모리 접근과 렌더 패스를 유발할 수 있으므로 실제 기기에서 비용을 측정해야 합니다.
- 타일 메모리와 외부 메모리 접근
TBDR은 타일 단위로 렌더링해 메모리 트래픽을 줄일 수 있지만, 포스트 프로세스에서 Depth/Normal 텍스처를 보존하거나 다시 읽으면 구현과 렌더 패스 구성에 따라 타일 메모리 밖의 접근이 늘 수 있습니다. 그 영향은 GPU, 해상도, 패스 구성과 장면에 따라 달라지므로 목표 기기에서 측정해야 합니다. - 샘플 접근 패턴
주변 픽셀의 깊이를 여러 오프셋에서 읽는 패턴은 화면 위치와 샘플 방향에 따라 캐시 지역성이 달라질 수 있습니다. 캐시 적중률이 반드시 낮아진다고 단정하지 말고 GPU 프로파일러로 확인합니다. - 추가 렌더 패스와 필터
노이즈 억제를 위해 블러나 업샘플 패스가 추가되면 렌더 타깃 전환과 타일 저장·불러오기가 발생할 수 있습니다. 실제 비용은 엔진이 패스를 병합하는지와 대상 GPU에 좌우됩니다.
모바일 환경에서 비교할 AO 최적화 대안 5가지
모바일 게임에서 런타임 풀스크린 AO의 비용을 줄이기 위해 검토할 수 있는 다섯 가지 기법을 소개합니다. 아래 순서는 보편적인 우선순위나 성능 보장을 뜻하지 않으며, 프로젝트와 기기별로 비교해야 합니다.
1. 정적 오브젝트 오프라인 라이트맵 AO 베이킹
움직이지 않는 건물, 지형, 배경 프랍에는 오프라인 AO 베이킹을 검토할 수 있습니다. Unity Progressive Lightmapper와 Unreal CPU Lightmass는 AO를 베이크할 수 있으며 Blender Cycles도 AO 결과를 베이크하는 워크플로를 제공합니다. Unreal GPU Lightmass는 현재 문서에서 precomputed AO를 지원하지 않는 것으로 표기되므로, 엔진 버전과 기능 지원을 확인해야 합니다.
- 별도 AO 텍스처를 피할 수 있도록, 형식과 머티리얼 규약이 허용하고 비어 있는 경우 베이킹된 AO를 기존 텍스처의 알파(A) 채널이나 ORM(Occlusion, Roughness, Metallic) 텍스처의 R 채널에 패킹할 수 있습니다.
- 런타임 AO 계산은 줄일 수 있지만, 패킹한 텍스처의 저장 공간과 샘플 비용은 남습니다. 채널의 기존 용도와 머티리얼 규약을 확인해 패킹합니다.
2. 버텍스 컬러(Vertex Color) AO 베이킹
배경 식생(Foliage), 바위, 복잡한 지오메트리 구조물은 텍스처 UV 공간 대신 버텍스 컬러의 R 채널에 AO 값을 구워 넣습니다.
버텍스 AO의 공간 세부도는 메시의 정점 밀도에 제한되므로, AO 변화가 메시에서 표현 가능한 경우에 사용합니다. 더 세밀한 음영이 필요하면 라이트맵이나 AO 텍스처와 비교합니다.
// ShaderLab Pass의 HLSLPROGRAM 안에 넣을 예시 (바깥 Shader/Pass 선언은 생략)
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#pragma vertex vert
#pragma fragment frag
struct Attributes
{
float4 positionOS : POSITION;
float3 normalOS : NORMAL;
float4 color : COLOR; // r: 베이킹된 AO
};
struct Varyings
{
float4 positionCS : SV_POSITION;
float ao : TEXCOORD0;
};
Varyings vert(Attributes input)
{
Varyings output;
output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
output.ao = input.color.r; // 추가 텍스처 샘플링 없이 전달
return output;
}
half4 frag(Varyings input) : SV_Target
{
half3 baseColor = half3(0.8, 0.8, 0.8);
half3 ambient = baseColor * input.ao; // 단순화한 예시: 실제 셰이더에서는 AO를 주변광 항에 적용
return half4(ambient, 1.0);
}
3. 동적 캐릭터용 캡슐/프록시 앰비언트 오클루전 (Capsule AO)
이 절의 캡슐 AO는 엔진 내장 기능 이름이 아니라, 본(Bone)에 연결한 캡슐 프록시로 동적 접촉 음영을 근사하는 사용자 정의 셰이더 기법을 뜻합니다. 움직이는 캐릭터가 지면이나 벽면에 닿을 때 발밑이 붕 떠 보이는 현상을 완화하는 후보가 될 수 있습니다.
- 캐릭터 뼈대에 필요한 수의 캡슐 프록시를 배치합니다. 개수와 위치는 캐릭터 형태와 성능 예산에 맞춰 정합니다.
- 지면 셰이더나 캐릭터 셰이더에서 캡슐 중심 선분과 표면점 사이의 최단 거리를 계산하고, 반지름과 감쇠 함수로 음영을 근사합니다. 구체적인 반지름과 감쇠 곡선은 장면과 성능 예산에 맞춰 검증해야 합니다.
- 뎁스 버퍼를 읽지 않고 벡터 유니폼(Uniform) 파라미터만으로 접촉 음영을 근사합니다. 실제 지형의 가림과 그림자를 완전히 대체하지는 않습니다.
4. 스크린 스페이스 AO 반해상도(Half-Resolution) 렌더링
고성능 모바일 기기에서 스크린 스페이스 AO를 반드시 사용해야 한다면 풀 해상도(Native)가 아닌 해상도(Quarter Pixel Count)로 렌더 타깃을 축소합니다.
- 렌더 타깃의 가로·세로를 절반으로 줄이면 AO 패스의 픽셀 수는 4분의 1이 됩니다. 따라서 해당 패스의 픽셀 셰이딩 작업은 줄지만, 전체 프레임 비용 절감률은 필터·업샘플·메모리 전송 비용에 따라 달라집니다.
- 업샘플링 시 Depth-Aware Bilateral Upsample을 적용하면 깊이 경계를 고려해 물체 외곽선에서 AO가 번지는 현상을 줄이는 데 도움이 됩니다.
5. 지면 접지용 페이크 데칼(Decal) AO
정형화된 드롭 섀도우나 접촉 음영이 필요한 이동형 오브젝트 하단에는 엔진의 블렌드 설정으로 Multiply와 같은 합성을 구현한 단순 Quad 폴리곤 데칼을 배치할 수 있습니다.
- 단순한 데칼은 구현하기 쉬운 접지 음영 대안입니다. 추가 드로우와 오버드로 비용을 목표 기기에서 비교하세요.

자주 묻는 질문 (FAQ)
Q1. 일부 GTAO 구현은 수식과 ALU 연산이 많을 수 있는데, 어떤 장면에서는 왜 유리할 수 있나요?
GTAO 계열은 horizon 기반 근사로 화면 접촉부를 다루는 방식이 장면과 목표 화질에 잘 맞을 수 있습니다. 다만 비용은 샘플링, 필터, 해상도와 엔진 패스 구성에 따라 달라져 항상 SSAO보다 빠르거나 우수하지는 않습니다. 같은 기기에서 같은 품질 목표로 프레임 시간을 측정해 선택하세요.
Q2. 유니티 URP 모바일 프로젝트에서 Screen Space Ambient Occlusion 렌더 피처를 활성화해도 되나요?
기기 등급만으로 적용 여부를 결정하기는 어렵습니다. 출력 해상도, 패스 구성, 프레임 목표와 실제 기기 측정값을 기준으로 판단하세요. 목표 기기에서 비용이 과하면 SSAO를 끄고 라이트맵 베이킹이나 버텍스 AO를 사용하는 구성을 검토할 수 있습니다.
Q3. 동적 캐릭터의 발밑 접지감을 살리기 위해 어떤 기법을 비교할 수 있나요?
캡슐 AO(Capsule AO) 또는 캐릭터 발 위치에 동기화되는 간단한 프로젝션 데칼/블롭 섀도우(Blob Shadow)를 후보로 비교할 수 있습니다. 화면 뎁스 버퍼를 읽지 않는 구성도 가능하지만 정점 셰이더, 머티리얼, 드로우 호출 비용은 구현과 장면에 따라 다릅니다.
결론 및 권장 워크플로우 요약
적합한 앰비언트 오클루전 구현 전략은 플랫폼과 프로젝트의 화질·성능 목표에 따라 달라집니다.
- PC 및 고사양 콘솔 타깃: 목표 화질과 프레임 예산에 맞춰 SSAO, GTAO, HBAO+를 비교하고 Temporal Denoiser가 필요한지 장면별로 검증합니다.
- 모바일 및 휴대용 콘솔 타깃: 목표 기기에서 포스트 프로세스 AO 비용을 측정합니다. 정적 환경에는 오프라인 베이킹(라이트맵 + 버텍스 컬러)을, 동적 액터에는 캡슐 프록시 AO를 우선 검토하고 화면 공간 AO는 예산에 맞을 때 사용합니다.



