3D 수학과 소프트웨어 래스터라이저 · 삼각형을 채우고 깊이로 가린다 · 실습
삼각형 채우기와 깊이 버퍼
목표
무게중심 좌표로 삼각형을 채우고, 꼭짓점 값을 보간하고, 깊이 버퍼로 앞뒤를 정하고, 뒷면을 걸러 냅니다. 이 실습이 끝나면 래스터라이저 한 벌의 핵심이 손에 들어옵니다.
왜 중요한가
화면은 픽셀 격자이고 삼각형의 변은 격자에 맞지 않습니다. 어떤 픽셀이 이 삼각형의 것인지 정하는 규칙이 필요한데, 무게중심 좌표가 그 규칙과 값 보간을 한꺼번에 해결합니다. 세 계수가 모두 0 이상이면 안쪽이고, 같은 계수로 색·법선·텍스처 좌표·깊이를 섞으면 됩니다.
깊이 버퍼는 그보다 더 큰 것을 줍니다. 픽셀마다 지금까지의 최소 깊이를 기억해 두면 그리는 순서와 무관하게 같은 그림이 나옵니다. 삼각형을 정렬할 필요가 없어지고, 서로 관통하는 물체도 자연스럽게 처리됩니다. 하드웨어가 화가 알고리즘 대신 이쪽을 고른 이유입니다.
단계
1. /root/raster 에 도구 상자를 놓습니다.
2. /root/raster/bary.py 에 무게중심 좌표를 만듭니다.
3. /root/raster/out/tri.png 에 삼각형을 채웁니다.
4. /root/raster/out/tri_rgb.png 에 꼭짓점 색을 보간해 그립니다.
5. /root/raster/out/zbuffer.png 에 깊이 버퍼로 두 삼각형을 그립니다.
6. 깊이만 맞바꾸어 /root/raster/out/zswap.png 를 만듭니다.
7. /root/raster/tris.txt 를 읽어 뒷면을 버리고 /root/raster/out/cull.png 와 /root/raster/out/07-cull.txt 를 만듭니다.
참고
- 그림은
nohup python3 -m http.server 8080 -d /root/raster/out &로 띄운 뒤 웹 미리보기 에서http://localhost:8080/을 열어 봅니다. zbuffer.png 와 zswap.png 를 나란히 보는 것이 이 실습의 핵심 장면입니다. - 픽셀 중심은 (x+0.5, y+0.5) 입니다. 정수 좌표로 판정하면 경계가 한 줄 밀립니다.
- 흔한 실수 하나: 깊이 비교는 했는데 깊이 버퍼를 갱신하지 않는 것입니다. 그러면 나중에 그린 것이 언제나 이깁니다.
- 흔한 실수 둘: 경계 상자를 잡지 않고 화면 전체를 도는 것입니다. 결과는 같지만 파이썬에서는 몇 배 느립니다.
단계 7개
- 그리기 도구 상자를 놓는다
- 무게중심 좌표
- 삼각형을 칠한다
- 꼭짓점 색을 섞는다
- 깊이 버퍼로 앞뒤를 정한다
- 깊이만 맞바꾼다
- 뒷면을 골라 버린다