Introduction

GPU의 렌더링 파이프라인은 주로 폴리곤으로 구성된 3차원 장면을 입력으로 받아서, 각각의 폴리곤을 2차원 형태로 바꾸고, 2차원 폴리곤 내부를 차지하는 pixel의 색깔을 결정하여 3차원 장면의 최종 영상을 생성한다.

Vertex processing(정점 처리) 단계는 정점 버퍼에 저장된 모든 정점에 대해 작동하며, transform(변환)을 비롯한 다양한 정점별 연산을 수행한다.

Rasterization(래스터화) 단계는 변환된 정점에 의해 정의된 폴리곤의 내부를 차지하는 fragment(프래그먼트)를 생성한다.

<aside> 💡 픽셀과 프래그먼트의 관계는 다음과 같다. 화면을 구성하는 픽셀 전체는 Color buffer(컬러 버퍼)라는 메모리 공간에 저장되는데, 한 화면을 생성하기 위해 이 컬러 버퍼는 여러 차례 수정된다. 이 수정 과정은 픽셀별로 진행되는데, 현재 컬러 버퍼에 저장된 픽셀을 수정하는데 필요한 데이터 모음을 fragment라 부른다.

</aside>

Rasterization 단계에서 출력된 fragment가 가질 수 있는 데이터의 예로는 텍스처 좌표(uv 좌표)가 있다. Fragment는 하나하나 Fragment Processing(프래그먼트 처리) 단계로 입력되어, texturing(텍스처링) 등의 작업을 거쳐 색상이 결정된다.

Output merging(출력 병합) 단계는 이러한 fragment와 현재 컬러 버퍼에 저장된 픽셀 중 하나를 선택하거나 혹은 이들의 색상을 결합하여 컬러 버퍼를 수정한다.

Untitled

렌더링 파이프라인은 두 단계로 구분할 수 있다.

(1). Programmable(프로그래밍 가능한) 단계: Vertex processing, Fragment processing

(2). Fixed(or hardwired) 단계: Rasterization, Output merging

Vertex processing 단계에서 수행되는 연산은 Transform, Lighting, Animation 등이다.

2.1. 월드 변환

Vertex processing 단계에서 각각의 정점은 아래 도시된 바와 같이 몇 가지 공간을 거쳐 마지막으로 Clip space에 도달한다.

Untitled

2.1.1. Affine Transform and Homogeneous Coordinates 아핀 변환과 동차 좌표

World transform과 View transform은 Scaling, Rotation, Translation 등과 같은 기본적은 변환들을 조합하여 만들어진다. Scaling, Rotation은 Linear transform이라 불리는 범주에 속한다. Translation은 Linear transform에 속하지 않는다. 대신 Linear transform과 함께 Affine Transform이라는 범주를 형성한다.

Scaling matrix

$$ \begin{pmatrix} \ s_x&0&0\ \\ \ 0&s_y&0\ \\\ 0&0&s_z\ \end{pmatrix} $$

$s_x,s_y,s_z$는 scaling factor이다. 모두 같은 값이면 uniform scaling이고, 같은 값이 아니면 non-uniform scaling이다.

Rotation matrix