삼각형을 화면의 칸으로 바꾸기
투영을 마치면 삼각형의 꼭짓점이 화면의 어디에 놓일지 알 수 있습니다. 다음으로 어느 픽셀의 샘플 위치가 삼각형 안에 있는지 판단해야 합니다. 이 과정이 래스터화입니다.
꼭짓점 사이의 값
삼각형 내부의 점을 세 꼭짓점의 가중합으로 표현할 수 있습니다. 가중치를 바리센트릭 좌표라고 합니다. 세 값의 합은 1이고, 내부에서는 모두 0 이상입니다. 예를 들어 (0.2, 0.3, 0.5)라면 각 꼭짓점의 정보를 그 비율로 섞습니다.
보간으로 깊이, 색, 질감 좌표 등을 계산합니다. 원근 투영된 속성은 모두 화면에서 단순 선형 보간하면 되는 것은 아닙니다. 질감 좌표처럼 원근을 고려해 보정할 값도 있습니다.
앞의 표면만 남기기
같은 픽셀에 여러 삼각형이 겹치면 깊이 버퍼로 가까운 표면을 선택합니다. 아래에서는 값이 작을수록 가깝다는 규칙을 사용합니다.
depth = float("inf")
color = None
for candidate_depth, candidate_color in [(0.7, "red"), (0.3, "blue")]:
if candidate_depth < depth:
depth = candidate_depth
color = candidate_color
print(color)
결과는 blue입니다. 그리는 순서만 믿는 대신 지금까지 남긴 깊이 0.7보다 0.3이 가까워 색을 바꿉니다. 실제 API에서는 깊이의 범위나 비교 방향을 다르게 설정할 수도 있습니다.
깊이 검사는 불투명 표면에 유용합니다. 반투명 표면은 뒤쪽 색도 필요하므로 깊이와 합성 순서를 함께 다뤄야 합니다. 서로 거의 같은 깊이의 면은 정밀도 부족으로 깜빡이는 z-fighting이 생길 수 있습니다.
확인 문제
멀리 있는 삼각형을 나중에 그렸다는 이유만으로 앞 삼각형을 덮어도 될까요?
해설 보기
불투명 표면에서는 가까운 깊이를 유지해야 합니다. 올바른 깊이 검사를 통과한 경우에만 색과 깊이를 갱신합니다. 단순한 마지막 그리기 순서는 가시성을 보장하지 않습니다.