오늘 끝나면
래스터라이저와 셰이더
- ✓래스터라이저와 셰이더의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 래스터라이저와이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
삼각형을 픽셀로 — barycentric·z-buffer·shader 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
반도체 설계 · 32
래스터라이저와
셰이더
화면은 삼각형 꼭짓점 3개로 모양을 정한다.
래스터라이저가 그 안을 픽셀로 채운다.
셰이더가 픽셀마다 색을 결정한다.
모든 형상은 삼각형으로 쪼개진다
화면 속 3D 물체는 결국 삼각형 무더기다. GPU가 다루는 가장 작은 면 단위가 삼각형이다.
삼각형 하나는 꼭짓점(vertex) 3개로 정의되고, 각 꼭짓점은 위치를 가진다.
왜 삼각형이냐면, 점 3개는 항상 한 평면 위에 있어 면이 휘지 않는다. 사각형은 비틀리면 면이 꺾인다.
그래서 곡면도 사람 얼굴도 잘게 쪼개 삼각형 수천 수만 개로 근사한다.
GPU가 받는 입력은 결국 꼭짓점 목록이다. 그 목록을 화면 픽셀로 바꾸는 것이 이 강의에서 다룰 일이다.
래스터화, 삼각형을 픽셀로 채우기
삼각형은 꼭짓점 3개뿐인데 화면은 픽셀 격자다. 그 안을 픽셀로 메우는 것이 래스터화다.
각 픽셀의 중심이 삼각형 안인지 밖인지 판정한다.
판정 도구는 barycentric 좌표다. 픽셀을 세 꼭짓점의 가중치 (u, v, w)로 표현한다.
규칙은 간단하다. u, v, w가 모두 0 이상이면 픽셀은 삼각형 안이다.
하나라도 음수면 밖이다. 곱셈 몇 번으로 픽셀마다 판정하니 수백만 픽셀도 병렬로 빠르게 메운다.
안으로 판정된 픽셀 하나를 fragment라 부른다. 셰이더가 다룰 알맹이다.
z-buffer가 앞뒤를 가린다
삼각형 둘이 겹치면 어느 것이 앞에 보여야 할까? 이 가림 문제를 푸는 것이 z-buffer다.
각 꼭짓점은 깊이값 z를 가지고, 값이 작을수록 카메라에 가깝다.
픽셀 안의 z는 barycentric으로 보간한다. 화면 픽셀마다 ‘지금까지 본 가장 가까운 z’를 저장해 둔다.
새 픽셀이 올 때 그 z가 저장된 z보다 작으면(더 가까우면) 색을 덮어쓰고 z도 갱신한다.
크면(더 멀면) 버린다. 이미 앞에 뭔가 있다는 뜻이다.
덕분에 삼각형을 아무 순서로 그려도 결과는 똑같이 가까운 것이 앞에 보인다. 따로 정렬할 필요가 없다.
직접 삼각형을 래스터화한다
작은 프레임버퍼에 삼각형 둘을 직접 그린다. 꼭짓점을 끌면 모양이 바뀌고 픽셀이 다시 채워진다.
두 삼각형이 겹친 자리엔 어느 것이 보일까. 예측을 고른 뒤 스캔라인을 한 줄씩 채워 barycentric 판정으로 픽셀이 메워지는 과정을 본다.
셰이더를 flat, depth, bary로 바꾸면 같은 픽셀의 색이 달라진다. 셰이더는 색을 정하는 작은 프로그램이다.
z-buffer를 끄면 먼 삼각형이 가까운 것을 가리는 잘못된 그림이 나온다. 깊이 검사가 푸는 문제가 눈에 보인다.
점선 = 삼각형 와이어프레임 · 채운 칸 = 픽셀(fragment). 꼭짓점 a빨강·b초록·c파랑.
끄면 그린 순서대로 덮어 먼 게 가까운 걸 가릴 수도 있다
삼각형은 꼭짓점 3개뿐이지만, barycentric으로 어느 픽셀이 안인지와 z, 색을 칸칸이 채운다. 겹친 자리는 z-buffer가 가까운 걸 골라 가림을 푼다.
그래픽 파이프라인, 꼭짓점에서 픽셀까지
지금까지의 단계를 한 줄로 이으면 그것이 그래픽 파이프라인이다. GPU가 매 프레임 도는 고정된 흐름이다.
꼭짓점을 받아 화면 좌표로 옮기고(vertex),
삼각형 안을 픽셀로 채우고(raster),
픽셀마다 색을 계산하고(fragment shader),
z-buffer로 앞뒤를 가려(depth) 프레임버퍼에 쓴다(frame).
이 흐름이 초당 수십 번, 픽셀 수백만 개에 동시에 돌아 한 장면이 만들어진다.
단계가 정해져 있어 GPU는 각 단계를 하드웨어로 깔고 lane을 잔뜩 붙여 한꺼번에 굴린다. 28~31강의 SIMD, 워프, 행렬기가 다 여기에 쓰인다.
Q. z-buffer가 푸는 문제는 무엇인가?
정답은 가림(어느 픽셀이 앞에 있어 보이는지)이다.삼각형이 겹칠 때 픽셀마다 z(깊이)를 비교해, 더 가까운(z가 작은) 것만 색을 남기고 먼 것은 버린다.
그래서 삼각형을 아무 순서로 그려도 가까운 면이 앞에 보인다. 따로 정렬할 필요가 없다.