렌더링 파이프라인 완벽 이해 – Rasterizer 단계는 왜 필요할까?

이전 글에서는 Vertex Shader 단계가 왜 필요한지를 정리했습니다.

Vertex Shader 단계에서 GPU는 단순히 Vertex를 처리하는 것이 아니라,
3D 공간 정보를 화면 계산이 가능한 형태로 변환한다는 점도 함께 살펴봤습니다.

특히 아래와 같은 핵심 공간 변환이 Vertex Shader 단계에서 이루어진다는 점을 확인했습니다.

  • World 변환
  • View 변환
  • Projection 변환

이번 글에서는 렌더링 파이프라인의 다음 단계인 Rasterizer 단계에 대해 정리해보려고 합니다.

Rasterizer 단계는 결국 3D 공간의 삼각형을 실제 화면 픽셀로 변환하기 위해 등장한 과정이라고 볼 수 있습니다.

그리고 이 단계를 이해하기 시작하면 왜 GPU가 Triangle 기반으로 발전했는지,
왜 “픽셀을 채운다”는 표현이 등장하는지,
왜 해상도가 성능과 연결되는지도 함께 이해할 수 있게 됩니다.


Vertex Shader가 끝났다고 화면에 바로 그릴 수 있는 것은 아니다

Vertex Shader 단계가 끝나면 GPU는 Projection 변환까지 처리된 Vertex 데이터를 가지게 됩니다.

이제 GPU는 카메라 기준에서 삼각형이 어디에 위치해야 하는지를 알게 됩니다.

하지만 여기에서 중요한 문제가 하나 남아 있습니다.

모니터는 결국 픽셀(Pixel) 기반 화면이라는 점입니다.

예를 들어 모니터 해상도가 아래와 같다고 가정해보겠습니다.

1920 x 1080

GPU는 결국 이 수많은 픽셀 중에서 어떤 픽셀이 삼각형 내부에 포함되는지 계산해야 합니다.

래스터 이미지를 시각적으로 표현한 이미지
래스터 그래픽 이미지 – 출처 WIKI

그리고 이후에는 각 픽셀이 어떤 색상을 가져야 하는지도 처리해야 합니다.

즉, Vertex Shader 단계가 끝났다고 해서 곧바로 화면에 출력할 수 있는 것은 아닙니다.

여전히 삼각형이 화면 위의 어떤 픽셀을 차지하는지를 계산해야 합니다.

그리고 바로 이 작업을 Rasterizer 단계가 담당합니다.


3D 삼각형을 화면 픽셀로 바꿔야 한다

Vertex Shader 단계에서는 Vertex 위치 변환이 이루어졌습니다.

하지만 실제 모니터는 결국 픽셀 기반 2D 화면입니다.

따라서 GPU는 이제 삼각형이 화면 위에서 어떤 형태로 보이는지를 계산해야 합니다.

예를 들어 아래와 같은 Triangle이 있다고 가정해보겠습니다.

Triangle = (0, 1, 2)

Rasterizer 단계는 이 삼각형을 보고 어떤 픽셀들이 삼각형 내부에 포함되는지를 계산하기 시작합니다.

Rasterizer 단계는 결국 3D 공간 기반 Primitive를 실제 픽셀 후보(Fragment) 형태로 변환하는 과정입니다.


왜 이름이 “Rasterizer”일까?

Raster라는 단어는 원래 격자(Grid) 형태를 의미합니다.

실제로 모니터 화면 역시 수많은 픽셀 격자로 구성됩니다.

Rasterizer는 결국 삼각형을 픽셀 격자 위로 변환하는 과정이라고 할 수 있습니다.

다시 말해 삼각형이 화면의 어떤 픽셀 칸들을 차지하는지를 계산하는 단계입니다.

그래서 Rasterizer 단계 이후부터는 GPU가 실제 픽셀 단위로 계산을 시작할 수 있게 됩니다.


왜 GPU는 삼각형 내부 픽셀을 계산해야 할까?

렌더링 파이프라인을 공부하다 보면 “Vertex 위치만 알면 그냥 그릴 수 있는 것 아닌가?”라는 생각을 할 수도 있습니다.

하지만 실제 화면은 점(Vertex)만으로 구성되지 않습니다.

우리가 실제로 보는 것은 삼각형 내부가 채워진 형태의 이미지입니다.

예를 들어 캐릭터 얼굴 모델도 결국 수많은 삼각형 표면으로 구성됩니다.

그리고 GPU는 이 삼각형 내부를 픽셀로 채워야 비로소 실제 화면 이미지를 만들 수 있습니다.

Rasterizer 단계는 결국 삼각형 표면을 실제 화면 이미지로 변환하기 위한 과정이라고 볼 수 있습니다.


Rasterizer는 픽셀 후보(Fragment)를 생성한다

Rasterizer 단계는 최종 픽셀 색상을 계산하는 단계는 아닙니다.

대신 “이 픽셀이 삼각형 내부에 포함된다”는 픽셀 후보(Fragment)를 생성합니다.

Rasterizer 단계에서는 어떤 픽셀이 Primitive 내부에 포함되는지 계산하고,
각 픽셀이 어떤 깊이값(Z값)을 가지는지, 그리고 어떤 보간값을 가지는지도 함께 계산합니다.

그리고 이후 Pixel Shader 단계에서 이 Fragment를 기반으로 실제 최종 색상이 계산됩니다.


보간(Interpolation)은 왜 필요할까?

Rasterizer 단계에서 굉장히 중요한 작업 중 하나가 바로 보간(Interpolation)입니다.

예를 들어 Vertex마다 아래 같은 색상 정보가 있다고 가정해보겠습니다.

Vertex 0 = Red
Vertex 1 = Blue
Vertex 2 = Green

그렇다면 삼각형 내부 픽셀 색상은 어떻게 결정될까요?

GPU는 단순히 한 Vertex 색상을 사용하는 것이 아니라, 삼각형 내부 위치에 따라 값을 부드럽게 섞기 시작합니다.

이 과정을 보간(Interpolation)이라고 부릅니다.

그리고 이 보간 과정 덕분에 Texture 좌표(UV), Normal, Color 같은 다양한 데이터들도 Pixel Shader 단계로 자연스럽게 전달될 수 있습니다.

Rasterizer는 단순 픽셀 판별 단계가 아니라, 삼각형 내부 데이터를 픽셀 단위로 확장하는 과정이기도 합니다.


왜 해상도가 높아질수록 GPU 부하가 커질까?

Rasterizer 단계를 이해하기 시작하면 왜 해상도가 성능과 연관되어 있는지도 이해할 수 있습니다.

예를 들어 아래 두 해상도를 비교해보겠습니다.

1920 x 1080 | 3840 x 2160

FullHD에서 4k 해상도로 해상도가 높아지면 GPU가 처리해야 하는 픽셀 수 자체가 크게 증가하게 됩니다.
(1920 x 1080 = 약 200만개, 3840 x 2160 = 약 8백 20만개)

즉, Rasterizer 이후 단계에서는 픽셀 후보(Fragment) 개수가 급격히 증가할 수 있습니다.

그리고 이후 Pixel Shader 단계에서 이 픽셀들에 대해 실제 색상 계산까지 수행해야 합니다.

해상도가 높아질수록 GPU 계산량이 커지는 이유 역시 Rasterizer 이후 처리해야 하는 픽셀 수 자체가 증가하기 때문입니다.


왜 GPU는 Triangle 기반으로 발전했을까?

Rasterizer 단계를 공부하다 보면 GPU가 왜 Triangle 기반으로 발전했는지도 이해하기 쉬워집니다.

삼각형은 항상 하나의 평면을 보장합니다.

그래서 내부 판별, 보간 계산, Rasterization 같은 작업을 안정적으로 수행할 수 있습니다.

반면 사각형 이상의 Polygon은 꼬이거나 비평면 형태가 될 수 있습니다.

GPU 입장에서는 Triangle이 가장 계산하기 좋은 Primitive 구조에 가깝습니다.

그래서 현대 GPU는 대부분 Triangle 기반 렌더링 구조를 사용합니다.


Rasterizer 단계는 이후 Pixel Shader와도 연결된다

Rasterizer 단계가 끝났다고 해서 렌더링이 끝나는 것은 아닙니다.

이후 GPU는 생성된 Fragment를 기반으로 실제 픽셀 색상을 계산하게 됩니다.

Rasterizer 단계는 결국 Pixel Shader 단계의 입력 데이터를 생성하는 과정이라고 볼 수 있습니다.

그리고 이 단계가 제대로 동작하지 않으면 이후 Pixel Shader 역시 정상적으로 동작할 수 없습니다.

Rasterizer 단계는 렌더링 파이프라인에서 픽셀 처리의 시작점에 가까운 단계라고 볼 수 있습니다.


Rasterizer는 결국 “삼각형을 픽셀로 변환하는 단계”다

흐름을 따라가다 보면 Rasterizer 단계는 삼각형 기반 Primitive를 실제 화면 픽셀 후보 형태로 변환하는 과정이라는 것을 알 수 있습니다.

그리고 이 과정을 이해하기 시작하면 Fragment, Interpolation, Depth 같은 개념들이 왜 등장하는지도 함께 이해할 수 있게 됩니다.


마무리

Rasterizer 단계는 단순 픽셀 판별 단계처럼 보일 수도 있습니다.

하지만 실제로는 3D 공간의 삼각형을 실제 화면 픽셀 기반 구조로 변환하는 핵심 단계에 가깝습니다.

그리고 이 단계에서 Fragment 생성, 보간(Interpolation), 깊이값 계산 같은 중요한 작업들이 수행됩니다.

다음 글에서는 Pixel Shader 단계가 왜 필요한지,
그리고 GPU는 왜 최종 픽셀 색상을 계산하기 시작했는지를 이어서 정리해보려고 합니다.


👉 게임 엔진 구조를 더 깊이 이해하고 싶다면

아래 강의를 통해 직접 구현해보는 것을 추천드립니다.

C++로 만드는 게임 엔진 프레임워크 강의

👉 C++로 만드는 게임 엔진 프레임워크 강의 바로가기

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다