-
[컴퓨터 그래픽스] Image Texturing컴퓨터그래픽스 2024. 2. 16. 13:49
자.. 이제까지의 내용을 정리해보자
오브젝트 공간에서 정의된 물체를 월드 변환을 통해 월드 공간으로 가져온다. -> 월드 공간에서 존재하는 물체는 뷰 변환을 통해 카메라 공간에서 정의된다 -> 카메라 공간에서 정의된 뷰 프러스텀의 각종 파라메터들과 투영 변환을 이용해 2x2x2 공간을 만들게 된다. 투영 변환 후의 공간을 클립 공간이라 한다. -> 투영 변환된 물체가 레스터라이저로 들어간다 -> 레스터라이저는 클리핑, 원근 나눗셈, 뒷면 제거, 뷰포트 변환, 스캔 전환 등의 작업을 수행하게 된다. 뷰포트 변환을 거치고 나면 polygon mesh들이 모두 스크린 공간으로 옮겨진다. 그 다음 스캔 전환이 실행되어 보간의 원리로 삼각형의 정점별 attribute를 이용해 각 fragment마다 새로운 attribute를 할당한다. ( attribute에는 노멀과 텍스처 좌표를 기본적으로 가진다) -> 오늘 설명할 내용까지 온 것이다..
아주 복잡한 과정을 거쳐 결국 래스터라이저는 프래그먼트별 attribute에 노말과 텍스처 좌표를 포함하여 프래그먼트 쉐이더에 넘겨준다. 그러면 프래그먼트 쉐이더는 이를 이용해 색상을 계산한다.
이번 포스팅에서는 프래그먼트 쉐이더가 구현하는 다양한 알고리즘에 대해 정리한다. 크게 Lighting과 Texturing으로 나눠지는데 이번 시간엔 Texturing만 다룬다.
1. 텍스처 좌표

텍스처는 배열 구조를 가진다. 이 배열 구조가 색상을 포함하면 이를 image texture 이라 한다.
텍스처를 구성하는 요소를 텍셀(texel)이라 한다. 이미지 텍스처의 텍셀은 픽셀과 같은 개념이다.
그림과 같이 텍스처링은 물체의 표면에 텍스처를 감싸는 것이다. 밀랍 코딩? 과 비슷하다. 이 작업을 하기 위해선 물체의 polygon mesh의 정점마다 텍스처 좌표(texture coordinate)를 할당해야 한다.

왼쪽 그림은 스크린 좌표계에서 프래그먼트 별로 텍스처 좌표를 계산한 것이다. 다시 한번 상기시키자면, 이 과정은 래스터라이저에 의해서 실행되며 각 프래그먼트마다 텍스처 좌표와 노말을 계산하여 attribute로 갖는다고 했다. 그림을 예로 들면, 스크린 좌표계에서 왼쪽 아래의 초록색 프래그먼트에서의 텍스처 좌표는 (1/8, 1/8)이라 할 수 있다.

실은 이 (s,t) 좌표는 그대로 사용하는 것이 아니다. 텍스처의 해상도에 따라 실제 텍스처 공간에서의 좌표(s', t')가 주어진다.
예를 들어 해상도가 4x4인 텍스처가 주어진다면, 우리가 원래 알고 있던 텍스처 좌표인 (1/8, 1/8)에 각각 4가 곱해진 (0.5, 0.5)가 바로 텍스처 공간에서의 실제 좌표가 된다. 이와 같은 일을 텍스처 좌표(s, t)가 텍스처 공간의 (s', t')로 투영되었다고 표현한다.
텍스처 공간의 좌표를 알게 되면 해당 텍셀의 RGB값을 가져와 프래그먼트에 입히게 된다. 이러한 방식으로 프래그먼트에 색상이 채워지게 되는 것이다. 이 내용은 수업을 들을때도 정말 재미있게 들었었는데.. 역시 다시 봐도 참신한 기술이다.
지금 설명한 내용은 2차원 texture에 관한 내용인데, 물론 3차원 텍스처도 존재한다. 이는 CT, MRI같은 기술에 쓰이며 볼륨 텍스처라고 부른다.

화질이 정말 구리네ㅎㅎ
아까 폴레곤 메시에다가 텍스처 좌표를 할당한다고 했는데, 그 작업을 표면 파라미터화 라고 한다. 저렇게 3차원 으로 되어있는 애들을 호떡 누르는거마냥 2차원으로 펼쳐서 좌표를 할당한다. 당연히 왜곡이 발생할 수 밖에 없는데 이를 줄이기 위해 꾸준히 연구중이라 한다.
2. 텍스처 포장
텍스처 좌표는 원칙적으로 [0, 1] 안에서 정의된다. 만약 이를 벗어난 좌표계가 텍스처 좌표로 설정되면 GL은 이를 허용하고 처리해준다. 바로 텍스처 포장 모드(texture rapping mode)를 설정하여 처리할 수 있다.
처리 방식은 크게 반복 모드와 반사 반복 모드로 나뉜다.

- 반복 모드는 말 그대로 [0. 1]에 있는 텍스처를 좌표 사이즈에 맞게 반복하는 것이다. (d)를 보면 타일이 여러번 반복된는 것을 볼 수 있다. 지금 주어진 텍스처 좌표의 범위가 [0, 3.5] 인데, 그래서 가로 세로로 3.5번씩 타일이 반복된 것을 볼 수 있다.
- (e). (f)가 바로 반사 반복 모드이다. 어느 방향으로 반사하는지는 사용자가 설정할 수 있다.
3. 텍스처 필터링
프래그먼트의 색상을 결정할 때 프래그먼트의 텍스처 좌표를 텍스처 공간에서의 좌표로 투영시킨다고 했다. 이때 텍스처 공간에서의 좌표(s', t')근처의 텍셀들을 고려해서 프래그먼트의 색상을 결정하게 되는데, 이를 텍스처 필터링 이라고 부른다.
- 만약 스크린 공간의 사각형의 크기가 이미지 텍스처보다 크다고 생각해보자. 이때는 이미지 텍스처가 사각형의 크기에 맞게 확대 되어야 한다. 관련 이미지를 가져오고 싶은데 사람 얼굴이 들어가있어서.. 초상권 이슈로 인해 그냥 말로 설명하도록 하겠다! 이미지 텍스처를 확대해야 한다는 것은 텍셀의 개수보다 프래그먼트의 개수가 많다는 것을 뜻한다.
- 반대로 이미지 텍스처가 엄청 커서 이를 축소해야 하는 상황을 생각해보자. 이때는 텍셀의 개수가 프래그먼트(=픽셀)의 개수보다 많을 것이다.
이미지 텍스처의 크기 여부에 따라 필터링 방법이 달라진다.
3-1 텍스처 확대
텍스처 확대에는 근접점 샘플링, 겹선형보간 두 가지 방법이 있는데, 확실하게 겹선형 보간이 더 나은 방법이다.


위에가 근접점 샘플링, 아래가 겹선형 보간이다. 둘다 보는 것처럼 하나의 텍셀 안에 여러개의 프래그먼트가 들어가 있는 것을 확인할 수 있다.
근접점 샘플링의 경우 여러 개의 프래그먼트가 하나의 텍셀의 색을 갖게 된다. 그렇게 되면 우리가 흔히 생각하는 안좋은 화질의 사진의 질감이 나타나게 된다. 겹선형 보간의 경우 하나의 프래그먼트 색상을 결정하는 데 있어 여러개의 텍셀이 사용되는데, 각 프래그먼트마다 다른 가중치 값이 적용된 식이 적용되기 때문에 조금 더 연속적인 색감 표현이 가능하게 되고, 이는 우리가 볼 때 더 부드러운 질감의 화질을 완성한다.
3-2 텍스처 축소
이미지 텍스처의 크기가 스크린 사각형의 크기보다 큰 경우 이를 축소해야 한다. 이때 에일리어싱(aliasing)문제가 발생하게 된다. 에일리어싱 문제는 원래 신호 처리 분야에서 쓰는 용어인데, 낮은 빈도로 샘플링을 할 때 발생하는 오류를 의미한다. 이미지 텍스처의 텍셀들의 수가 프래그먼트의 수보다 많게 되면 프래그먼트들은 이미지 텍스처의 다양한 면모를 모두 담아내지 못하는 것이다.

에일리어싱 문제
이를 위해 안티에일리어싱 기법이 발전하게 되는데, 그 중 하나가 밉매핑 이다.
4. 밉매핑
밉매핑의 개념 자체는 굉장히 간단하다. 텍스처를 작게 만들어서 텍셀 수를 픽셀 수에 맞추는 것이다. 예를 들어 4x4 텍셀이 있다고 하면 텍셀 4개의 평균 생상을 구하는 작업을 4번 하여 2X2 텍셀로 만드는 것이다!

위 사진과 같은 경우는 거의 있을 일 없는 아주 간단한 경우이다. 필터링이 두 단계로 진행돼서 텍셀의 개수와 프래그먼트의 개수가 맞아졌다.
저렇게 하나의 프래그먼트가 2의 지수개수의 텍셀을 차지하면 필터링이 간단하다.

그러나 저럴 일은 별로 없고, 위 사진처럼 프래그먼트가 차지할 영역(프래그먼트의 발자국)이 3인 경우도 있다. 이 경우 보는바와 같이 로그를 써서 레벨을 정하는데, 1.585가 나왔으므로 1보다는 2에 가까워서 2단계 레벨링을 진행한다.

또! 그런데! 저것보다 좋은 방법이 레벨 1과 레벨 2 모두를 채택해서 둘다 사용하는 삼선형 보간 방법이다! 두 레벨을 먼저 겹선형 보간으로 필터링한 후에, 또 걔네들끼리 선형보간한다. 이를 삼선형 보간(trilinear interpolation)이라 한다. 매우 중요하다
GL에서는 밉맵 필터링을 위한 다양한 언어를 제공한다
이러한 방식으로 프래그먼트에 색을 입혀줬으면, 다음은 라이팅을 적용시키면 된다. 말 그대로 음영을 처리하는 것이다.
'컴퓨터그래픽스' 카테고리의 다른 글
[컴퓨터 그래픽스] Output Merger (0) 2024.02.16 [컴퓨터 그래픽스] Lighting (0) 2024.02.16 [컴퓨터 그래픽스] Rasterizer (0) 2024.02.16 [컴퓨터 그래픽스] Vertex Processing (0) 2024.02.16 [컴퓨터 그래픽스] Spaces and Transforms (0) 2024.02.16