본문 바로가기

컴퓨터 그래픽스

컴퓨터 그래픽스 기초 - Fragment Shader part 1. Texturing ([KUOCW] 한정현 교수님 강의)

이 포스팅은 [KUOCW] 한정현 교수님 강의 8장 - 이미지 텍스처링을 듣고 정리한 내용입니다.

이미지 처리의 기초적인 지식이 요구됩니다.

Rendering Pipeline


지난 강의에서는 rasterizer를 통해 fragment(pixel)이 생성되는 것에 대해 포스팅을 했습니다. 이번 포스팅은 이 fragment를 프로그래밍하는 fragment shader에 texturing과 lighting 중 texturing을 어떻게 잘 맵핑하는지에 대해 알아보겠습니다.

이전 포스팅에서 rasterizer가 vertex로부터 fragment(pixel)을 보간하는 것을 보았다.


 

  • Texture Coordinate

먼저 Texture(Color map)는 지금까지 알아온 vertex 정보와는 또 다른 정보입니다. 2D texture를 기준으로 vertex가 하나의 3차원 모양을 나타냈다면, Texture는 그 표면의 색상이나 무늬 정보로 볼 수 있죠. 아래 사진과 같이 원통의 polygon에 (b)와 (c)에 해당하는 Texture를 입힐 수 있죠.

앞서 vertex shader에서도 vertex의 색상 정보를 bilinear interpolation을 해서 표현했는데 왜 색상을 나타내는 Texture가 따로 있냐고 말씀하실 수도 있습니다. 저도 좀 헷갈리는 부분인데, 우선 vertex만으로는 섬세한 색상의 표현이 불가해서 그런 것도 있는 거 같습니다. 그리고 이 포스팅에서 texture를 통해 object의 색상이 맵핑되는 다양한 방법을 제시하기 때문에 texture는 이런 색상을 더 섬세하게 연산 역할을 해주는 거라고 이해했습니다.

2D Texture가 원통형 object에 입혀진 모습

그럼 이런 Texture(2D)는 object의 표면에 어떻게 맵핑시킬까요? 우선 object의 표면을 2D로 나타내야 합니다. 이 부분은 강의에서 자세한 설명은 않고, 이런 표면은 2D로 안정적으로 필 수 있는 알고리즘이 있다~ 하고 넘어갔습니다. 이 알고리즘을 통해 복잡한 3D object의 표면이라도 2D로 표현 가능합니다. 이때 이 2D map은 가로세로 길이가 1인 정사각형 안에 아래 사진의 화살표로 표시된 부분 같이 Texture Coordinate이 구성됩니다. 이 과정을 Surface Parameterization라고 합니다. 이때 이 2D map의 각 pixel을 texel이라고 부릅니다. 여기서 색상은 원래 RGBA로 4가지 성분이지만 불투명 도인 A를 제외하고 RGB 기준으로 설명합니다.

 

하지만 아래 사진의 사람 전체 모습은 더 복잡한 형태를 가지고 있습니다. 이럴 때는 얼굴, 몸통.. 이런 식으로 그 부위를 나누어 Surface Parameterization를 수행하는데 각각의 Surface Parameterization 된 부분을 Chart, 이 chart를 모아서 Atlas라고 합니다. 

Surface Parameterization(좌)와 Chart(가운데 얼굴), Atlas(우)

 


 

 

  • Texture Wrapping Mode

다음으로는 Texture Wrapping Mode입니다. texture coordinates은 항상 [0,1] 범위 안에 국한될 필요 없습니다. 하지만 [0,1]범위안에 있는 Texture를 어떤 방식으로 범위 밖의 texture coordinates을 표현하는지에 대해서는 여러 가지 방법이 있습니다. 먼저 아래 사진에 (c)와 같이 가장 모서리의 색상을 연장하는 Clamp-to-Edge 방법이 있습니다. 또한 Texture를 계속해서 0->1, 0->1 반복해서 표현하는 Repeat 방법이 (d)에 나와있습니다. 하지만 Repeat 방법을 사용하면 그 경계가 부 자연 스러 원 질 수 있습니다. 따라서 반전해서 반복하는 Mirrored-Repeat 방법이 (e)에 나와있습니다. 각 방법은 s 축과 t 축에 각각 다르게 적용이 가능하기 때문에 f와 같이 s 축으로는 repeat, t 축으로는 Mirrored-Repeat을 사용할 수도 있죠.

여러가지 Texture Wrapping Mode


 

  • Texture Filtering - Magnification

Magnification란, rasterizer를 통과하여 생긴 pixel(fragment)이 texture map의 texel보다 많은 경우를 뜻합니다. 이런 경우 하나의 texel(RGB) 값이 여러 pixel을 표현하게 되겠죠. 이 경우를 Magnification라고 합니다. 이때 하나의 texel(RGB) 값으로 pixel을 표현하게 되면 아래 그림 기준으로 4 pixel이 같은 색상이 되어 사각형의 block이 형성되어 영상의 품질에 안 좋은 영향을 끼칠 것입니다. 이렇게 Magnification 상황에서 가까운 texel 값을 그대로 취하는 것을 Nearest point sampling이라고 합니다.

Magnification: 하나의 texel(RGB) 값이 여러 pixel을 표현한다

하지만 rasterizer에서도 언급한 bilinear interpolation을 사용하면 아래와 같이 texel값들 사이의 값으로 각 pixel을 채울 수 있습니다. 따라서 magnification 상황에서는 bilinear interpolation을 사용하는 것이 바람직하죠.

bilinear interpolation


 

  • Texture Filtering - Minification

Pixel이 texel보다 많은 magnification 상황에서는 영상의 품질에 문제가 조금 있었지만 큰 문제는 없었습니다. 하지만 그 반대인 texel이 pixel보다 많은 minification 경우에는 더 큰 문제가 나타 날 수 있습니다. 만약 아래와 같이 체크보드 모양의 texture가 있는데 각 pixel이 모든 texel에 매칭 되지 않고 일정 간격으로 pixel을 나타내면 체크보드임에도 아래 사진같이 한 가지 색상으로만 표현이 되죠. 이 문제를 aliasing problem이라고 합니다. 이는 표현하고자 하는 texture와 완전히 다른 texture로 표현되기 때문에 심각한 문제가 아닐 수 없습니다.

Minification aliasing problem

이 문제를 해결하기 위해 그래픽스에서는 texel의 수를 pixel의 수와 맞춰주기 위해 downsampling을 통해 minmap을 만듭니다. minmap이란 1/2배로 계속해서 downsampling 한 level-λ texture의 모음이죠. 이때 각 pixel에 맞는 level-λ texture는 각 pixel이 차지하는 texel의 가로세로 개수 m을 log_2(m)으로 표현하면 해당 level이 됩니다. 아래 그림은 λ = log_2(2)=1 level 이기 때문에 level 1과 매칭 되죠. 이렇게 같이 pixel과 texel의 숫자가 딱 맞으면 Minification의 문제는 해결된 것으로 보입니다. 하지만 많은 경우 아래 그림과 같이 pixel과 texel의 수가 딱 맞는 경우는 매우 드물죠. 따라서 더 자세히 어떻게 해결하는지 알아야 합니다.

 

Minmap을 활용한 minification 문제 해결:이런 경우는 드물다.

강의 자료에서는 아래 그림과 같은 예시를 드는데 이 경우 λ = log_2(3) = 1.585이기 때문에 level 1와 level 2 사이에 위치하죠. 

pixel과 texel의 수가 안 맞는 경우

이럴 때는 올림 또는 내림을 통해서 결정할 수 있고 레벨 λ를 결정할 수도 있고, level 1와 level 2에서 bilinear interpolation을 통해 구한 값을 다시 linear interpolation을 통해 그 값을 구할 수도 있습니다. 그림으로 표현하면 아래와 같습니다. 이 경우 trilinear interpolation이라고 합니다.

 

Level 1(왼쪽)과 level 2(가운데)에서의 linear interpolation, 그리고 그 값에 대한inear interpolation(오른쪽) : trilinear interpolation


또한 지금까지 clip space에서 object가 정면을 보고있다는 가정 하에 정사각형 혹은 직사각형으로 설명했습니다. 하지만 실제로는 z 축이 있기 때문에 같은 사각형 이어도 사다리꼴로 표시될 수 있죠. 아래 제가 모자란 실력으로 표현해 봤습니다만, 아래같이 정사각형 object가 clip space에 누워있다면 xy-plane에서 보면 사다리꼴로 보일 것입니다. 하지만 저 사각형에 매칭 되는 texture는 해당 object를 표현해야 하기 때문에 위의 픽셀과 아래 픽셀에 들어가야 하는 texel의 수가 달라지죠. 이렇게 되면 심한 경우 한쪽은 minification 문제 다른 한쪽은 magnification 문제가 발생할 수도 있죠. 이 부분은 더 자세히 다루지는 않지만 이런 문제도 그래픽스의 알고리즘이 처리해준다는 것을 알고 넘어가면 좋을 거 같습니다.


 

지금까지 vertex shader와 rasterizer를 통해 나온 pixel(v_texCoord)에서 어떻게 texture 정보가 할당되는지 알아보았습니다.  texture 정보가 처리되는 곳은 pipeline에서 본거 같이 fragement shader이며 이를 통해 texture를 자연스럽게 각 픽셀의 색상으로 할당할 수 있죠. 사실 강의나 자료에 코드로 설명한 부분에서도 얻어갈 수 있는 디테일한 정보가 더 있으므로 시간이 되시면 아래 링크를 참조하셔서 보시는 것을 추천드립니다. 본 포스팅은 이론 위주로만 설명합니다.

vertex shader와 fragment shader의 관계: 중간에 rasterizer 과정도 있다.

 

감사합니다.

 

References

강의: [KUOCW] 한정현 교수님 강의

https://www.youtube.com/channel/UCfyXTCv0QlZxG1S1rteGI7A

강의 자료: 한정현 교수님 연구실 홈페이지
http://media.korea.ac.kr/books/