kwan's note

이미지 텍스처링 (image texturing) 본문

graphics VR AR/Computer Graphics -Korea Univ

이미지 텍스처링 (image texturing)

kwan's note 2021. 6. 25. 02:13
반응형

본 학습노트는 2021년 1학기 고려대학교 한정현 교수님의 컴퓨터 그래픽스 강의를 수강하고 이 내용을 기반으로작성하였습니다.

 

https://reminder-by-kwan.tistory.com/135

 

래스터라이저 (Rasterizer)

본 학습노트는 2021년 1학기 고려대학교 한정현 교수님의 컴퓨터 그래픽스 강의를 수강하고 이 내용을 기반으로작성하였습니다. https://reminder-by-kwan.tistory.com/134 정점 처리 ( view transform, project..

reminder-by-kwan.tistory.com

 

이제 우리는 vertex shader로부터 rasterizer 까지 진행했다.

레스터라이저가 출력하는 attribute는 texture coordinate과 선형보간을 통해 얻어진 normal을 포함한다.

 

fragment shader는 texturing과 lighting을 진행한다.

이번 노트에서는 texturing을 알아보도록 하자.

 

texture는 모델링한 polygon mesh에 입히는 옷이다. 다음과 같은 원통에 texturing을 진행한다고 해보자.

texture는 texel 이라는 elements로 일어져 있다. 이전에 계산된 fragment에는 해당 점들에 대응하는 texture 좌표(texel)이 존재하게 된다. 따라서 texture image의 점들(texel)을 polygon mesh의 vertex에 할당하고 이전에 진행했던것과 같은 방식으로 선형 보간한다.

이러한 방식으로 폴리곤 메시의 각 vertex에 텍스처 좌표(s,t)를 할당하는것을 surface parameterization이라고 한다. 이를 위해 mesh를 평면에 펼치는 작업을 해야한다. 3차원 polygon mesh를 펼치는것은 왜곡을 가져오는데 이를 최소화하는것도 매우 중요하다. 하지만 여기서는 이러한 작업을 모두 다루지는 않겠다.

 

이렇게 펼쳐놓은것을 chart라고 하고 chart들의 모임을 atlas라고 한다.

 

여기서 중요한 한가지 문제는 texture의 크기와 polygon mesh의 크기가 다를때 발생한다.

즉 해상도가 다른경우의 해결에 대한 문제이다.

먼저 texture image가 작은 경우 텍스처 이미지를 확대해야 한다. 반대로 texture image가 큰 경우 축소해야한다.

 

texture 확대의 방법은 nearest point sampling, bilinear interpolation등이 있다.

먼저 nearest point는 왼쪽과 같이 n개(여기선 4개)의 픽셀 모두 하나의 texel로 표현하는 방식이다. 가장 가까운 texel을 가져오는 방식으로 간단하지만 blocky image가 만들어진다. 즉 깨지는 현상이 발생한다.

 

다음으로 가능한 방식은 bilinear interpolation이다. 즉 2번 선형보간하여 해당 pixel의 rgb값을 선택하는 방식이다. 이를 통해 계단 형태의 blocky image를 줄일 수 있다.

 

 

 

이 외에도 여러 방법이 있지만 여기서는 두가지 간단한 방법을 소개했다.

 

 

다음으로는 texture image가 더 큰 경우 texture 를 축소해야 한다. texture가 높은경우 아무 문제가 없을것 같지만 그렇지만은 않다. 만약 가장 가까운 점들을 단순 선택한다면 이미지의 특징을 잃버어릴 수 있게된다.

이러한 문제를 앨리어싱(aliasing)이라고 한다. 즉 고주파를 낮은 빈도로 샘플링하는 경우 발생하는 오류를 뜻한다. 이러한 앨리어싱으로 인한 문제를 최소화 하기 위한 방법을 안티 앨리어싱이라고 한다.

 

대표적인 안티앨리어싱 기법으로 mipmap 방식이 있다.

4개의 픽셀을 바인딩해 하나의 픽셀로 만들고 이를 level1 이라고 한다. 다시 level1의 2x2를 하나로 바인딩해 level2 ...level n 까지 단계적으로 texel을 만든다. 이제 level 1에서 pixel과 texel의 비율을 람다라고 하고 로그 람다를 이용해 어떤 level을 사용할 것인지 선택한다.

log 람다가 2일때는 딱 맞게 사용할 수 있다. 만약 람다가 정수가 아닌 유리수 라면 어떻게 해야할까

람다가 3으로 log 람다 = 1.585일때를 가정해보자.

이때는 level 1에서도 2에서도 1대1 mapping이 되지 않는다. 이때는 level 1에서 bilinear interpolation을 진행하고 level2에서도 bilinear interpolation을 진행한다. 그 후 마지막으로 level 1과 level2에 대해 0.585 : 1-0.585의 비율로 다시 보간한다.

 

이런 방식으로 texture filtering을 진행한다. fragment shader가 진행하는 대표적인 두 작업중 첫번째인 이미지 텍스쳐링을 진행하였다. 다음 노트에서는 lighting을 배워보도록 하겠다.

반응형