3차원 공간에 존재하는 장면 데이터를 사람이 볼 수 있는 2차원 화면 이미지로 바꾸는 작업은 매우 중요합니다. 게임 속 세계는 좌표와 수치로 이루어진 수학적 데이터의 집합입니다. 하지만 플레이어는 그 결과를 픽셀로 채워진 화면으로 인식하죠.
이 둘 사이를 이어 주는 다리가 바로 렌더링 파이프라인(Rendering Pipeline)입니다. 숫자로 된 3D 세계를 색이 있는 2D 그림으로 바꾸는 절차라고 이해하시면 쉽습니다. 이 과정은 아무렇게나 이루어지지 않습니다.
데이터가 그림이 되는 일정한 흐름
이 절차는 입력과 변환, 그리고 출력이라는 일정한 흐름을 가집니다. GPU가 엄청난 양의 데이터를 동시에 처리할 수 있도록 설계된 덕분입니다. 한 픽셀이나 한 삼각형을 순서대로 하나씩 처리하지 않습니다.
가능한 모든 계산을 나눠서 동시에 처리하는 것이 렌더링의 특징입니다. 수많은 데이터를 병렬로 다루기 때문에 복잡한 화면도 빠르게 만들어 낼 수 있죠. 처음엔 이 과정이 낯설 수 있지만 차근차근 살펴보면 이해가 되실 겁니다.

가장 먼저 무엇을 그릴지 정합니다
가장 앞단에서는 게임 엔진이 주도적으로 판단을 내립니다. 지금 어떤 장면을 그릴지, 카메라는 어디에 있는지 결정하는 단계입니다. 어떤 광원이 켜져 있는지도 여기서 정해집니다.
수많은 오브젝트 중에서 무엇을 실제로 그릴 것인가 같은 결정도 내려집니다. 씬을 구성하고 조명 정보를 정리하는 작업은 대부분 CPU에서 이루어집니다. 엔진이 렌더링에 필요한 재료를 골라 정돈하는 구간이라고 보시면 됩니다.
점들의 위치를 화면에 맞게 옮깁니다
그다음으로 넘어가면 이제 본격적으로 GPU가 움직이기 시작합니다. 이 단계에서는 각 메시를 구성하는 정점 데이터가 처리됩니다. 정점에는 위치뿐 아니라 표면의 방향을 나타내는 정보도 들어 있습니다.
이 정점들은 처음에는 오브젝트 기준의 좌표계에 있습니다. 이후 월드 공간과 카메라 기준의 뷰 공간을 거쳐 화면에 투영하기 위한 클립 공간으로 변환되죠. 이 정점이 화면 어디에 와야 하는지를 계산하는 역할을 정점 셰이더가 맡습니다.
삼각형을 픽셀 조각으로 나눕니다
정점들이 화면에 놓일 준비를 마치면 삼각형은 이제 픽셀 단위로 쪼개집니다. 이 과정이 바로 래스터화(Rasterization)입니다. 클립 공간에 있던 삼각형은 스크린 공간으로 변환되고 그 내부는 수많은 픽셀 조각으로 나뉩니다.
이때 깊이 테스트를 통해 다른 물체에 가려진 픽셀은 제거됩니다. 화면을 향하지 않는 면도 제외되죠. 실제 해상도에 맞게 좌표를 맞추는 뷰포트 변환도 이 단계에서 함께 이루어집니다.
각 픽셀에 색을 입히는 과정입니다
이후에는 각 픽셀 하나하나에 대해 색상을 결정하는 단계가 이어집니다. 이 픽셀은 무슨 색이어야 하는가를 고민하는 시간이죠. 조명 계산이 이루어지고 텍스처에서 색을 가져옵니다.
그림자나 반사 같은 효과도 이때 적용됩니다. 이 역할을 담당하는 것이 픽셀 셰이더 혹은 프래그먼트 셰이더입니다. 제한된 시간 안에서 최대한 그럴듯한 결과를 만들기 위해 수많은 근사 계산을 수행합니다.
완성된 장면을 눈으로 확인합니다
마지막으로 이렇게 계산된 최종 색상은 프레임버퍼에 기록되고 화면에 표시됩니다. 이 시점에서 하나의 프레임이 완성됩니다. 플레이어는 비로소 그 결과를 눈으로 보게 되죠.
이 모든 과정은 단 한 번으로 끝나는 것이 아니라 매 프레임마다 반복됩니다. 초당 30번 혹은 60번 이상 이 전체 흐름이 쉼 없이 돌아갑니다. 덕분에 우리는 움직이는 게임 화면을 경험하게 됩니다.
효율적인 협력이 만드는 결과물
렌더링 파이프라인은 실시간이라는 빡빡한 제약 속에서 돌아가는 정교한 절차입니다. 3D 데이터를 2D 이미지로 바꾸기 위해 CPU와 GPU가 역할을 나눠 맡습니다. 서로 효율적으로 돕는 과정이 인상적이죠.
이 덕분에 현대 게임은 복잡한 장면을 빠르고 안정적으로 화면에 그려 낼 수 있습니다. 프로그래머에게는 이 전체 흐름을 이해하는 것이 꽤 중요합니다. 그래픽이 만들어지는 원리를 알면 최적화의 길도 보이기 때문입니다.