Texturing and Lighting


vertex shader와 rasterizer를 거치면서 pixel들의 좌표와 normal 벡터들을 얻어냈습니다. 그렇다면 이 정보들을 토대로 texture와 light를 입혀서 최종적으로 화면을 그려낼 수 있을 것입니다.

이번 글에서는 Texturing에 대해서 정리해보도록 하겠습니다.

Texturing


Texturing은 아래와 같이 물체에 texture를 씌우는 과정을 의미합니다.



이렇게 텍스쳐를 씌우는 것은 굉장히 간단하게 이루어지는데요. 우선 각 vertex에는 texture corrdinates(s,t)가 존재합니다. 그러므로 이 좌표를 통해 texture에서의 적당한 지점을 가져오게 되면 물체에 texture를 씌울 수 있습니다.



그렇다면 texture coordinate만 있으면 texturing은 쉽게 진행되는 것 같은데 이것은 언제 할당될까요?

이 좌표는 modeling 단계에서 할당되며 Surface parameterization이라고 불립니다.

Minification & Magnification


한편 이런 texturing을 할 때 몇가지 이슈가 있습니다.

이미지가 작을 때 우리의 fragment에 맞추기 위해 이미지를 키워야하는 magnification문제, 이미지가 클 때 이미지를 줄여야하는 minification문제가 있습니다.

Magnification문제의 경우 상식적으로 생각할 수 있는 두 가지 방법을 통해 해결할 수 있는데, 아래와 같습니다.

  1. Nearest point sampling
  2. Bilinear interpolation

Nearest point sampling이란 근처의 점들을 합한 색을 채워넣어 사진 크기를 키우는 것으로 아래와 같습니다.



Bilienar interpolation은 위치를 고려하여 주변의 점들을 적당히 섞는 것으로 1번과 비슷하지만 좀 더 정밀한 보간을 한 것입니다.



그런데 minification같은 경우 이런 식으로 할 경우 문제가 생길 수 있습니다. 다음의 그림을 보면 픽셀의 위치와 텍스처의 텍셀의 위치가 운이 안좋게 겹쳐서 실제 체커보드 이미지와 달리 아예 까맣거나 회색인 이미지가 나올 수 있습니다.



이를 위해 minification의 경우 Mipmap이라는 것을 사용합니다. 원래 이미지의 절반 크기에 해당하는 이미지를 만들고 또 절반에 해당하는 이미지를 만들어놔서 적당한 임지를 사용하는 것입니다.



이런 방식을 사용하게 되면 minification의 문제도 적절히 해결가능하며 textuing을 성공적으로 수행할 수 있게 됩니다.