언리얼 기술: 디퍼드 셰이딩

불 켜는 걸 미뤄두는 그림 그리기, 디퍼드 셰이딩
게임 화면에는 전등이 아주 많아요. 가로등, 네온사인, 마법 이펙트까지 전부 빛이에요. 이 빛들을 컴퓨터가 하나하나 계산해서 화면을 색칠하죠. 그런데 빛이 100개쯤 되면 컴퓨터가 헉헉대기 시작해요.
그래서 사람들이 꾀를 냈어요. "빛 계산을 나중으로 미루자!" 이게 바로 디퍼드 셰이딩(Deferred Shading)이에요. 디퍼드(deferred)는 영어로 "미뤄진"이라는 뜻이거든요. 1988년에 마이클 디어링이라는 사람이 처음 낸 아이디어인데, 지금은 언리얼 엔진의 기본 방식이 되었어요.
옛날 방식은 왜 힘들었을까?
옛날 방식(포워드 렌더링)은 이렇게 그려요. 물체를 하나 그릴 때마다, 그 자리에서 바로 모든 전등을 켜 보면서 색을 정해요.
나무 한 그루를 그린다고 해 볼게요. "가로등 빛은 여기 닿나? 달빛은? 모닥불 빛은?" 나무 하나에 전등 100개를 전부 확인해요. 그다음 바위를 그릴 때 또 100개를 확인하고요. 물체가 1,000개고 빛이 100개면, 계산을 10만 번 해야 하는 셈이에요.
더 억울한 일도 생겨요. 열심히 색칠한 나무가 나중에 그린 큰 바위에 가려지면? 그 계산은 전부 헛수고가 돼요. 지우개로 지워지는 그림에 물감을 쓴 거죠.
디퍼드 셰이딩의 꾀: 먼저 메모, 나중에 색칠
디퍼드 셰이딩은 그리기를 두 번에 나눠서 해요.
첫 번째: 전등을 전부 끈 채로, 화면의 점(픽셀)마다 정보만 메모해요. "이 점은 원래 빨간색이야", "이 점은 카메라에서 이만큼 멀어", "이 점의 표면은 이쪽을 보고 있어" 이런 것들이요.
두 번째: 메모가 다 끝나면, 그제야 전등을 켜고 화면에 보이는 점들만 색칠해요. 가려져서 안 보이는 부분은 애초에 메모에 없으니까, 헛수고가 사라져요!
메모장의 정체, G-버퍼
이 메모장 묶음을 G-버퍼라고 불러요. G는 지오메트리(geometry), 그러니까 "모양 정보"라는 뜻이에요. 화면 크기와 똑같은 메모장이 여러 장 있다고 생각하면 돼요.
첫 번째 메모장에는 물체의 원래 색을 적어요. 빛을 하나도 받지 않았을 때의 민낯 색깔이죠.
두 번째 메모장에는 카메라에서 얼마나 멀리 있는지를 적어요. 가까우면 밝게, 멀면 어둡게 표시돼요. 이걸 Z-버퍼(깊이 버퍼)라고 해요.

세 번째 메모장에는 표면이 어느 쪽을 보고 있는지 적어요. 이걸 노멀(normal)이라고 하는데, 빛을 받으면 얼마나 반짝일지 계산할 때 꼭 필요해요. 손등에 손전등을 비출 때, 손등이 손전등 쪽을 향하면 밝고 옆으로 돌리면 어두워지는 것과 같은 원리예요.

드디어 전등을 켠다
메모가 끝나면 두 번째 그리기가 시작돼요. 이번에는 물체를 다시 그리는 게 아니라, 화면의 점 하나하나를 보면서 메모를 읽어요. "이 점은 빨간색이고, 이만큼 멀고, 이쪽을 보고 있네. 그럼 가로등 빛을 받으면 이 색이 되겠다!" 이렇게요.
중요한 건, 화면에 보이는 점들만 계산한다는 거예요. 빛이 100개여도 가려진 물체 때문에 낭비되는 계산이 없어요. 그래서 전등이 아주 많은 장면에서 훨씬 빨라져요.

직접 써 보면 어떨까?
쓸 때 좋은 점: 빛을 마음껏 뿌릴 수 있다는 게 정말 커요. 포워드 방식에서는 "이 방에 조명 몇 개까지만 넣자"고 아껴가며 배치했는데, 디퍼드에서는 촛불 50개짜리 방을 만들어도 프레임이 크게 안 무너져요. 그리고 G-버퍼에 정보가 다 남아 있으니까, 나중에 화면 전체에 효과를 얹기도 편해요. 언리얼에서 스크린 스페이스 반사 같은 게 잘 되는 이유가 이거예요.
쓸 때 힘든 점: 유리나 물처럼 반투명한 물체가 골칫거리예요. 메모장에는 점 하나당 정보 한 벌만 적을 수 있는데, 반투명은 뒤에 있는 것까지 비쳐 보여야 하거든요. 그래서 반투명만 따로 옛날 방식으로 그려야 해서 일이 두 배가 돼요. 메모장을 여러 장 들고 다니니 메모리도 많이 먹어서, 사양이 낮은 폰에서는 버벅이기 쉽고요. 계단처럼 우둘투둘한 테두리를 부드럽게 하는 MSAA라는 기법도 그대로는 못 써서, 다른 방법으로 돌려 막아야 해요.
정리하면
디퍼드 셰이딩은 "먼저 메모하고, 나중에 몰아서 색칠하기"예요. 색칠공부를 할 때 밑그림과 설명을 먼저 다 그려 놓고, 마지막에 한 번에 예쁘게 칠하는 것과 같아요. 덕분에 빛이 수백 개인 화려한 장면도 그릴 수 있게 되었고, 언리얼 엔진 같은 큰 게임 엔진들이 이 방식을 기본으로 쓰고 있답니다.
출처
리깅 파이프라인 자동화 도구
반복 작업은 스크립트에게. 현업에서 쓰는 리깅 툴 모음.
리깅 도구 보기