셰이더와 GPU 파이프라인 · UV 와 텍스처 표본화 · 실습
무늬를 붙이고 표본을 꺼낸다
목표
텍스처를 만들고, 두 가지 표본화 방식을 구현하고, 원근 보정 보간의 차이를 눈으로 봅니다. 마지막에는 축소에서 생기는 지글거림과 밉맵이 그것을 어떻게 없애는지 숫자로 확인합니다.
왜 중요한가
정점마다 색을 붙이면 삼각형 하나에 색 세 개뿐입니다. 텍스처는 색을 기하에서 떼어 내 별도의 이미지에 두고, 표면의 각 지점이 그 이미지의 어디를 가리키는지만 정합니다. 그 좌표가 UV 이고, 래스터라이저가 픽셀마다 보간해 줍니다.
여기서 두 가지가 특히 중요합니다. 하나는 원근 보정입니다. 화면 좌표에서 UV 를 그냥 섞으면 원근이 들어간 면에서 무늬가 뒤틀립니다. 화면에서 균등한 간격이 3차원 공간에서는 균등하지 않기 때문입니다. 다른 하나는 축소입니다. 한 픽셀이 텍셀 수십 개를 덮으면 그중 하나만 골라서는 무늬를 대표하지 못하고, 카메라가 조금만 움직여도 화면이 지글거립니다. 밉맵이 그 답입니다.
단계
1. /root/texture 에 도구 상자를 놓습니다.
2. /root/texture/tex.py 와 out/checker.png — 체커 무늬.
3. /root/texture/sample.py — 최근접 표본화.
4. /root/texture/bilinear.py — 쌍선형 표본화.
5. /root/texture/out/affine.png — 보정 없는 보간.
6. /root/texture/out/correct.png 와 diff.png — 원근 보정.
7. /root/texture/out/mip0.png, mip1.png, out/07-mip.txt — 축소와 밉맵.
참고
- 그림은
nohup python3 -m http.server 8080 -d /root/texture/out &로 띄우고 웹 미리보기 에서http://localhost:8080/을 엽니다. affine.png 와 correct.png 를 나란히 보는 것이 이 실습의 핵심 장면입니다. - 흔한 실수 하나: 쌍선형에서 0.5 를 빼지 않는 것입니다. 텍셀의 중심이
(i+0.5)/폭에 있어서, 이 반 칸을 빼먹으면 그림이 밀립니다. - 흔한 실수 둘: 음수 UV 에서
int()로 자르는 것입니다.int(-0.3)은 0 이고floor(-0.3)은 -1 이라 한 칸이 어긋납니다.
단계 7개
- 그리기 도구 상자를 놓는다
- 체커 무늬 텍스처
- 최근접 표본화
- 쌍선형 표본화
- 보정 없이 붙인다
- 원근 보정 보간
- 축소와 밉맵