디퍼드 셰이딩

편집 역사 토론
컴퓨터 그래픽스 게임 개발 마지막 수정: 2026-07-19 04:21:07

1. 개요[편집]

디퍼드 셰이딩
Deferred Shading
핵심 자료구조G-버퍼(Geometry Buffer)
패스 구성지오메트리 패스 + 라이팅 패스
복잡도물체 + 조명 (곱이 아닌 합)
주 병목메모리 대역폭
천적반투명, MSAA

조명을 계산할 픽셀이 어차피 가려져 죽을 픽셀인지, 우리는 그릴 때는 모른다. 그러면 다 그리고 나서 하면 되잖아.

디퍼드 셰이딩(deferred shading)은 지오메트리를 그리는 단계에서 조명 계산을 하지 않고, 각 픽셀의 재질 속성(알베도·법선·거칠기·깊이 등)을 G-버퍼라 부르는 화면 크기 텍스처 묶음에 일단 기록해 둔 뒤, 별도의 화면 공간 패스에서 조명을 한꺼번에 계산하는 실시간 렌더링 구조다. 이름 그대로 셰이딩을 “미룬다”.

핵심 이득은 복잡도의 형태가 바뀐다는 것이다. 전통적 포워드 셰이딩에서 조명 비용은 대략 (그려지는 픽셀 조각 수) × (조명 수)에 비례한다. 디퍼드는 지오메트리 패스와 라이팅 패스가 분리되므로 (조각 수) + (보이는 픽셀 수 × 조명 수)가 된다. 곱셈이 덧셈으로 바뀌는 셈이고, 무엇보다 최종 화면에 실제로 보이는 픽셀에 대해서만 조명을 계산한다. 오버드로가 심한 장면에서 조명 수백 개를 켤 수 있게 된 결정적 이유다.

2. 역사[편집]

개념 자체는 오래됐다. 1988년 Deering 등이 유사한 파이프라인을 제안했고, “G-buffer”라는 용어는 1990년 사이토와 다카하시(Saito & Takahashi)가 3D 형상에 윤곽선·해칭 같은 이해도를 높이는 표현을 입히는 논문에서 붙였다.1 당시엔 비사실적 렌더링(NPR) 도구였지 조명 최적화가 아니었다.

실제로 게임에 실린 것은 다중 렌더 타깃(MRT)과 충분한 메모리 대역폭이 확보된 2000년대 후반이다. 《S.T.A.L.K.E.R.》(2007), 《Killzone 2》(2009)가 대표 사례로 자주 인용되고, CryEngine 3와 Unreal Engine 4가 기본 경로로 채택하면서 콘솔 세대의 표준 렌더러가 되었다. 그 사이 대역폭이 부족하던 시기에는 G-버퍼를 줄이려고 지오메트리를 두 번 그리는 라이트 프리패스(deferred lighting) 변종도 널리 쓰였다.

3. G-버퍼[편집]

디퍼드의 모든 장단점은 G-버퍼 레이아웃에서 나온다. 전형적인 구성은 이렇다.

렌더 타깃저장 내용흔한 포맷
RT0알베도(기저색) + AO 또는 셰이딩 모델 IDRGBA8
RT1월드/뷰 공간 법선 (인코딩)RG16 또는 RGB10A2
RT2금속성·거칠기·스페큘러RGBA8
깊이깊이-스텐실D32 또는 D24S8

여기에 모션 벡터, 서브서페이스 파라미터, 발광이 붙으면 4~5장으로 늘어난다. 1920×1080에서 픽셀당 16바이트면 G-버퍼만 33 MB이고, 이것을 매 프레임 쓰고 조명마다 읽는다. 그래서 디퍼드 렌더러의 성능 지표는 ALU가 아니라 거의 항상 대역폭이다.

법선 저장은 특히 신경 쓰는 부분이다. 8비트 3채널로 저장하면 넓은 면에서 밴딩이 그대로 보이므로, 단위 벡터라는 제약을 활용해 팔면체 인코딩(octahedral encoding)으로 2채널 16비트씩에 밀어 넣는 것이 관례가 됐다. 채널 하나를 아끼면서 정밀도는 올라간다. 위치도 따로 저장하지 않고 깊이와 화면 좌표로부터 역투영해 복원한다 — 저장하는 것보다 계산하는 것이 싸다는 대역폭 시대의 논리다.

4. 라이팅 패스[편집]

G-버퍼를 다 채웠으면 조명을 쏜다. 순진하게 조명마다 전체 화면 사각형을 그리면 화면 전체를 조명 수만큼 읽게 되므로 아무도 그렇게 하지 않는다.

  • 광원 볼륨(light volume) — 점광원은 반경만큼의 구를, 스포트라이트는 원뿔을 실제 지오메트리로 그린다. 래스터화된 픽셀만 셰이딩되므로 영향 범위 밖은 자동으로 걸러진다. 스텐실 버퍼로 볼륨 내부만 표시하는 기법이 함께 쓰인다.
  • 타일드 디퍼드(tiled deferred) — 화면을 16×16 같은 타일로 나누고, 컴퓨트 셰이더로 각 타일의 깊이 범위와 교차하는 광원 목록을 만든 뒤, 타일당 G-버퍼를 한 번만 읽어 목록의 조명을 전부 누적한다. 대역폭 관점에서 결정적 개선이다.
  • 클러스터드(clustered) — 타일을 깊이 방향으로도 쪼개 3차원 클러스터로 만든다(Olsson 등, 2012). 타일드가 깊이 범위가 넓은 타일에서 헛도는 문제를 없애고, 깊이 프리패스에 의존하지 않으므로 포워드 경로에도 그대로 쓸 수 있다. 이것이 이른바 **Forward+**이며, 오늘날 상당수 엔진이 디퍼드 대신 여기로 돌아간 이유이기도 하다.

조명 자체의 BRDF 평가는 물리 기반 렌더링 규약을 따르고, 그림자는 그림자 매핑으로 별도 계산된 맵을 조회한다.

5. 약점[편집]

디퍼드가 만능이었다면 이 절은 없었을 것이다.

  • 반투명 — G-버퍼는 픽셀당 재질 하나만 담는다. 유리창 뒤의 물체와 유리창을 동시에 담을 방법이 없다. 그래서 거의 모든 디퍼드 렌더러가 반투명 물체용 포워드 패스를 따로 굴린다. 렌더러 두 벌을 유지한다는 뜻이고, 재질 코드가 두 경로에서 미묘하게 달라지는 것은 시간문제다.
  • MSAA — 하드웨어 안티에일리어싱은 삼각형 가장자리에서 서브샘플을 여러 개 두는 기법인데, G-버퍼를 MSAA로 뜨면 용량과 대역폭이 배수로 뛰고 조명도 샘플별로 해야 한다. 이 비용을 감당하기 싫었던 업계는 후처리 AA와 시간적 안티에일리어싱(TAA)으로 갈아탔다. 오늘날 게임이 대부분 TAA를 쓰는 배경에는 디퍼드의 이 구조적 제약이 있다.
  • 재질 다양성 — G-버퍼에 들어가는 파라미터 집합이 곧 표현 가능한 재질의 전부다. 피부의 서브서페이스 산란이나 머리카락의 이방성 BRDF처럼 파라미터가 다른 재질은 셰이딩 모델 ID를 넣어 분기하거나(GPU에서 분기는 비싸다) 포워드로 빼야 한다.
  • 대역폭 — 위에서 말한 그것. 특히 모바일의 타일 기반 GPU에서는 G-버퍼를 시스템 메모리로 왕복시키면 배터리부터 녹는다. 다만 Vulkan의 서브패스나 Metal의 이미지 블록처럼 G-버퍼를 온칩 타일 메모리에 두고 같은 타일 안에서 즉시 소비하는 API 기능이 생기면서, 모바일 디퍼드도 조건부로 현실적인 선택지가 됐다.

6. 파생과 후계[편집]

디퍼드가 만들어 놓은 “화면 공간에 재질 정보가 다 있다”는 상황은 그 자체로 자산이라, 여기에 얹히는 기법이 줄줄이 생겼다.

  • 디퍼드 데칼 — 총탄 자국·핏자국을 볼륨으로 그려 G-버퍼의 알베도·법선을 직접 덮어쓴다. 메시를 건드리지 않고 재질만 갈아끼우는 것이라 디퍼드에서 거의 공짜다.
  • 화면 공간 기법앰비언트 오클루전(SSAO), 화면 공간 반사(SSR), 화면 공간 전역 조명이 전부 G-버퍼의 깊이·법선을 입력으로 쓴다. 화면 밖 정보가 없다는 원죄를 공유하지만 싸다.
  • 비지빌리티 버퍼(visibility buffer) — 재질 속성 대신 삼각형 ID와 인스턴스 ID만 저장하고, 속성 보간조차 라이팅 시점으로 미룬다(Burns & Hunt, 2013). G-버퍼가 픽셀당 8바이트 수준으로 줄어 대역폭 문제를 정면으로 공격하며, 마이크로폴리곤 규모의 지오메트리를 다루는 근래 파이프라인이 이 방향을 택했다.
  • 하이브리드 — 하드웨어 레이 트레이싱이 실린 뒤로는 G-버퍼가 1차 광선의 결과물 역할을 하고, 반사·그림자만 광선으로 보강하는 구성이 흔하다. 래스터화로 채운 G-버퍼는 사실상 “공짜로 얻은 1차 히트 정보”다.

7. 여담[편집]

  • 디퍼드로 넘어간 팀이 가장 먼저 겪는 일은 아티스트가 조명을 300개 박는 것이다. 조명이 싸졌다는 소문은 항상 예산보다 빨리 퍼진다.
  • G-버퍼 레이아웃 회의는 렌더링 팀에서 가장 정치적인 회의다. 채널 하나를 얻으려면 누군가는 자기 기능의 정밀도를 내놔야 한다.2
  • “화면 가장자리에서 반사가 사라진다”는 버그 리포트는 버그가 아니라 화면 공간 기법의 정의다.3

8. 관련 문서[편집]

9. Footnotes[편집]

  1. Saito, T. & Takahashi, T. (1990). “Comprehensible Rendering of 3-D Shapes”. SIGGRAPH ‘90. 깊이·법선을 버퍼에 담아 후처리로 윤곽선을 뽑는 것이 목적이었다. 즉 디퍼드 셰이딩의 자료구조는 조명 최적화가 아니라 만화풍 외곽선에서 태어났다. 20년 뒤 완전히 다른 이유로 부활한 셈.

  2. 흔한 결말은 “일단 RGBA8 하나 더 붙이자”이고, 다음 분기 성능 리뷰에서 그 타깃을 없애는 태스크가 생긴다.

  3. 반사되어야 할 물체가 화면 밖에 있으면 화면 공간에는 그 정보가 아예 없다. 그래서 SSR은 화면 경계로 갈수록 반사를 페이드시켜 티가 덜 나게 감추고, 못 채운 부분은 미리 구운 큐브맵으로 폴백한다. 눈속임 위에 눈속임을 얹는 것이 실시간 렌더링의 정신이다.