1.컴퓨터 그래픽스란?
수학적 장면 정보를 이미지(2D/3D)로 변환 조작 출력하는 기술
2. 그래픽스 파이프라인
다음과 같은 과정을 거쳐서 이미지가 디스플레이된다.
[ 애플리케이션 단계 ] (CPU)
└─ 월드·카메라·조명 설정
↓ ↓ ↓ ↓
[ 지오메트리 단계 ] (GPU, Vertex Shader)
모델 → 월드 → 뷰 → 클립 ──┐
(4×4 행렬 곱) │ ①
└─ 원근 나누기(Persp Div) ─┘
↓
**NDC** : Normalized Device Coordinates
(x,y,z가 모두 −1 ~ +1 범위)
[ 래스터화 단계 ] (고정 기능)
NDC 삼각형 → 픽셀 조각(Fragments) ②
↓
[ 프래그먼트 처리 단계 ] (Fragment Shader)
색 계산·깊이/블렌딩 검사 ③
↓
[ 출력 병합 단계 ] (GPU)
최종 프레임버퍼에 write ④
↓
모니터에 그림 표시
① 지오메트리 = “행렬 계산” 구간
여기서 배우는 모델·월드·뷰·투영 행렬을 차례로 곱해 클립 공간 좌표를 만든다.
이어서 원근 나누기(클립 w로 나눔)를 하면 NDC로 변환된다.
NDC에 들어오면 이미 계산하기 쉬운 표준 좌표계(−1~1)라서 이후 단계가 단순해진다.
② 래스터화
NDC 삼각형의 면적을 픽셀 단위로 잘게 쪼개서 “프래그먼트”를 생성한다.
아직 색이 정해지지 않은 잠정 픽셀 데이터라고 생각하면 된다.
③ 프래그먼트 처리
각 프래그먼트마다 셰이딩(조명식 계산), 텍스처 샘플링, 깊이·스텐실 테스트 등을 진행해 최종 색을 얻는다.
④ 출력 병합 (Output Merger)
알파 블렌딩, 멀티렌더 타깃 등을 거친 뒤 프레임버퍼에 기록되며 화면에 표시된다.
3. 좌표 공간 & 변환 행렬
공간 | 목적 | 4×4 행렬 |
---|---|---|
모델(Model) | 객체 고유 좌표 | M |
월드(World) | 씬 공용 좌표 | 누적 M |
뷰(View) | 카메라 기준 | V |
클립(Clip) | 절단 평면 적용 | P (투영) |
NDC→스크린 | 픽셀화 | Viewport |
변환 순서 : p_screen = Viewport · P · V · M · p_model
TRANSFORMATION (2D) — 아핀 변환 (Affine Transformations)
아핀 변환이란?
아핀 변환은 점, 직선, 평면 사이의 상대적 관계를 유지하면서 수행되는 변환으로, 그래픽스에서 객체의 위치, 크기, 회전 등을 변경하는 기본적인 도구다.
즉, 직선은 변환 후에도 직선으로 유지되고, 평행한 직선은 항상 평행으로 유지되는 변환을 의미한다.
아핀 변환의 종류
2D에서 흔히 사용되는 아핀 변환의 종류는 다음과 같다.
종류 | 설명 | 자유도 |
---|---|---|
이동 (Translation) | 물체 위치를 옮기는 변환 | 2 |
회전 (Rotation) | 물체를 원점 또는 특정 점을 중심으로 회전시키는 변환 | 1 |
크기 조절 (Scaling) | 물체 크기를 확대 또는 축소하는 변환 | 2 |
전단 (Shearing) | 한 축 방향으로 물체를 비틀거나 기울이는 변환 | 2 |
반사 (Reflection) | 특정 축 또는 직선을 기준으로 대칭 이동시키는 변환 | - |
아핀 변환의 일반적인 행렬 형태는 다음과 같다.
$\begin{bmatrix} a & b & e \\ c & d & f \\ 0 & 0 & 1 \end{bmatrix}$
각 변환의 행렬 표현
① 이동 (Translation)
점 (x,y)(x, y) 를 $t_x$, $t_y$ 만큼 옮길 때의 행렬:
$T(t_x, t_y) = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{bmatrix}$
② 회전 (Rotation)
원점을 기준으로 반시계 방향으로 $\theta$ 만큼 회전시키는 행렬:
$R(\theta) = \begin{bmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix}$
③ 크기 조절 (Scaling)
각 축의 방향으로 크기를 $s_x$, $s_y$배로 늘리거나 줄이는 행렬:
$S(s_x, s_y) = \begin{bmatrix} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & 1 \end{bmatrix}$
④ 전단 (Shearing)
한 축 방향으로 다른 축 방향에 비례하여 비틀거나 기울이는 행렬.
(아래는 X축 방향으로 수평 전단하는 경우임. k는 전단 비율)
$H_x(k) = \begin{bmatrix} 1 & k & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}$
(Y축으로 전단은 비슷한 형태로 표현된다.)
⑤ 반사 (Reflection)
특정 축 또는 선을 기준으로 반사하는 행렬 예시:
- X축 기준 반사:
$F_x = \begin{bmatrix} 1 & 0 & 0 \\ 0 & -1 & 0 \\ 0 & 0 & 1 \end{bmatrix}$
- Y축 기준 반사:
$F_y = \begin{bmatrix} -1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}$
아핀 변환의 조합 (복합 변환)
아핀 변환은 행렬 곱을 통해 여러 변환을 조합해 사용할 수 있다.
예를 들어, 한 점을 이동하고 회전하고 크기를 조정하고 싶다면 다음과 같이 행렬을 곱해주면 된다.
$p_{new} = T \cdot R \cdot S \cdot p_{original}$
중요: 변환의 순서가 바뀌면 결과가 달라진다.
일반적으로 행렬 곱은 오른쪽부터 왼쪽으로 적용된다.
동차 좌표계 (Homogeneous Coordinate)
아핀 변환은 항상 3×3 행렬로 나타나며, 원래 2차원 좌표를 표현할 때 동차좌표계를 사용한다.
- 일반 좌표 (x,y)(x,y) → 동차 좌표 (x,y,1) (x,y,1)
동차 좌표계를 쓰는 이유:
- 이동까지 포함한 모든 변환을 행렬 곱 형태로 표현 가능해진다.
- 변환 행렬을 하나의 통합된 형태로 편리하게 다룰 수 있게 해준다.