[ Texture Mapping ]
[ Texture Mapping ]
3차원 Object에 pattern을 mapping 하는 것
pattern은 1차원, 2차원, 3차원 전부 될 수 있음.
→ 주로 2D + image로 정의됨.
[ Texture Space ]
2차원 좌표계, 0에서 1사이 값을 가짐
texture space를 구성하는 하나하나의 컬러들은 다음과 같은 component를 가질 수 있음.
- RGBA (A : 알파, 투명도)
- RGB
- A single luminance value (흑백일 경우에 해당, 또는 intensity라고도 부름)
보통 축을 s, t, r로 부르는데, 1차원일 경우 s축만 사용하는 형식이다.
1d texture pattern부터 알아보면서, 차원을 확장해 나가보자.
[ 1D Texture Pattern ]
1차원 배열 형태로 구현되어 있음.
example) 32개의 RGB : 32 * 3 → 0~95
컨셉의 영역 : 0 ~ 1.0
구현의 영역 : s값이 몇인 texel을 가져온다.
arr[0] → RGB 3개 가져옴.
[ Mapping a linear texture pattern into a scene ]
하나의 spatial position에 s좌표 값을 할당하고, 두번째 spatial position에 또 다른 s좌표 값을 할당한다.
그 다음, s좌표 범위에 따라 color array에서 해당하는 color가 두 position 사이를 매핑하여 채운다.
- mapping을 모니터 화면에 있는 line에 할려고 할 때, texel의 수가 pixel의 수보다 더 작을 수 있다.
이 때, texel이 pixel을 2번씩 찍으면 된다.
반대로, texel의 개수가 pxeil의 개수보다 많다면, 2가지 방법을 사용할 수 있다.
1) 비례식으로 비율대로 가져와서 찍음 (샘플링)
2) 여러 개를 평균내어 매핑함
2가지 방법은 성능과 퀄리티 사이의 trade-off 존재.
1)은 일부만 가져오므로 성능은 좋으나 퀄리티가 떨어질 것.
여러 개를 평균/조합 하는 것은 반대로 전부 다루므로 성능은 떨어지나 퀄리티는 좋음.
- Texture coordinates의 범위(0 ~ 1.0)가 초과될 경우
1) integer 부분을 무시 : 1.1 → 0.1, 1.5 → 0.5
2) clamping : 1.1 → 1.0, 1.5 → 1.0
API를 사용하면, 어떤 방법을 사용할지 선택권을 준다.
[ 2D Texture Pattern ]
2차원이므로 직사각형 컬러 패턴을 가짐.
축이 확장되어 2차원 s, t 좌표 사용.
16x16x3 : 768 elements
[ Mapping a surface texture pattern into a scene ]
1) texture pattern의 4개의 모서리에 대한 (s, t) texture space 좌표를 4개의 공간 좌표에 할당
- 삼각형의 vertices에 해당하는 3개의 texure space 좌표를 할당해도 됨.
2) linear transformation을 사용하여 projected pixel position에 컬러 값이 할당될 수 있다.
[ Two ways of surface texture mapping ]
내부적으로 그래픽카드는 어떤 과정을 통해 mapping하는가?
1) Texture scanning (Forward mapping)
Texel로 부터 시작해서 (s, t)가 3차원 (x, y, z)의 어느 좌표로 매핑되어야 하는지 알고, transformation을 통해 모니터 어느 좌표로 와야 하는지 안다면, 이 과정이 Forward Mapping
Texture space → Object space → Screen space (projected plane)
문제점 : 옮겨왔을 때, 픽셀의 수가 불일치 할 수 있음.
→ 1대1 대응이 되지 않아, 정확히 원하는 픽셀 위치에 오지 않고 건너 뛰어 표시될 수도 있다.
2) Inverse scanning (Inverse mapping)
Texture scanning (Forward mapping)의 해결법
역행렬을 구해서 거꾸로 찾아간다.
Pixel Area → Surface → Projected Pixel Area
이 방식또한 정확히 맞진 않으나, 건너 뛰어 구멍이 나지 않고 중복 되는 것이므로 채울 수는 있다.
대부분의 API는 Inverse scanning 방식으로 구현
→ Screen에서 부터 거꾸로 어디에서 왔는지 찾아가는 것.
[ Example : transferring a pattern to a Cylindrical surface ]
곡면상의 임의의 점에 대해서, (s, t)를 assign할 수 있는가에 대한 예제
임의의 좌표 (u, v)라고 하자.
→ x, y, z로 부터 s, t를 구할 수 있고, 또 거꾸로 θ로 부터도 구할 수 있다는 것을 알 수 있는 것.
θ와 z 좌표를 알고 있으니 mapping 하도록 texture 좌표 (s, t)를 구할 수 있음.
[ 3D Texture Pattern ]
= Volume Texture, (s, t, r)
공간을 가로지르는 조각을 잘라내서 입힌다.
16x16x16x3 = 12'288 elements
3차원이므로 8개의 좌표 (직육면체)를 8개의 spatial position에 할당한다.
벽돌, 나무, 과일 등 3차원 object의 전체 범위에 texture pattern을 적용하는 것이 가능하다.
Texture에 특수한 효과를 주고 싶을 때 사용. 용량이 크므로 잘 사용되진 않는다.
[ Texture Reduction Patterns (Mipmaps) ]
Mapping을 할 때, 픽셀의 크기 차이가 원근때문에 크게 난다면, 인간의 검은색을 회색으로 보는 등 연한색으로 보이는게 더 자연스러우나, 멀리있더라도 texture의 크기를 그대로 가져오므로, 중간의 색이 안찍히게 된다. (이 현상을 Aliasing이라고 함.)
패턴이 있을 경우 pattern이 깨져서 보이게 됨.
[ 해결법 : Mipmaps ]
작은 size용 texture를 미리 만들어둔다. (1/2, 1/4, 1/8, 1/16, ....)
사이즈가 줄어들수록 blur를 해서 색도 약간 연하게 만들어 두어, 작은 사이즈가 필요할 때 작은 것을 매핑해준다.
대부분의 API들은 하드웨어적으로 2^n 단위로 작아지는 mimaps을 지원한다.
[ Procedural Texturing Methods ]
Texture는 기본적으로 디자이너가 만들지만, 알고리즘을 통해 texture pattern을 만들어 낼 수도 있다.
특정 (s, t)가 있을 때 어떤 값이 나오도록 : F(s, t)
Texture image가 없고, 함수를 이용하는 것.
→ 용량의 이점을 가지나, 계산하는 시간적인 소모가 있음.
[ Bump Mapping ]
Fine surface detail(세밀한 표면 디테일)을 추가할 때 사용되는 Texture Mapping
→ 울퉁불퉁한 표면을 갖는 Object, 과일같은 것을 나타내고 싶을 때 사용
원래 매끈한 표면이지만, 울퉁불퉁하게 보일 수 있게 해준다.
높은 것은 흰색, 낮은 것은 검정색으로 표현되는 2D Height Map을 만들어놓는다.
surface에 height map을 적용시키면, 기존에 매끈한 표면에 height map의 흰색, 검정색에 따라 높이가 변경되어 높이 차에 따라 "surface normal"을 계산할 수 있게 된다.
surface normal들이 울퉁불퉁하도록 변경되는 것 !
그 다음, 변경된 surface normal들에 대해 illumination model을 적용한다.
[ Normal Map ]
Height map을 통해 surface normal을 계산해야 하는 것은 똑같으므로, Height Map을 이용하는 것이 아니라 처음부터 surface normal map을 제공해 주는 또 다른 방식.
→ 2가지 방법이 있다.
울퉁불퉁한 것과 Bump mapping한 것이 실제로 똑같이 보임.
어차피 렌더링이라는 것은 시야(V), normal(N), light(L), 이 3가지에 의해 결정되므로 normal을 바꿔줬으니 영향을 미치는 것.
실제로 울퉁불퉁한 것은 하나씩 전부 튀어나와야 하므로 vertex 개수가 더욱 필요하게 된다.
장점 : 만들기 쉽고, 보이는 것도 똑같으며, vertex 수를 줄일 수 있다 (계산량과 직결된다)
→ FPS를 늘릴 수 있다.
단점 : 실제 형태가 바뀐 것은 아니므로, 실루엣과 그림자는 영향을 받지 않게 된다.
단점은 displacement mapping이라고 하는 것으로 어느정도 극복가능한데, height map과 비슷한 Displacement Map이라고 하는 것을 만들어서, vertex가 어느정도 실제로 튀어나오게 할지 지정해주는 것.
→ per-vertex 연산이 가능해야 하므로 shader가 있는 modern graphics api들은 사용할 수 있다.
[ Reference ]
Computer Graphics with OpenGL 4th edition, Hearn, Baker
'컴퓨터공학 > Computer Graphics' 카테고리의 다른 글
Vertex Shaders, Fragment Shaders (0) | 2024.11.13 |
---|---|
Tangent Space (0) | 2024.11.07 |
Illumination Models and Surface-Rendering Methods - 3 (0) | 2024.10.28 |
Illumination Models and Surface-Rendering Methods - 2 (0) | 2024.08.25 |
Illumination Models and Surface-Rendering Methods - 1 (0) | 2024.08.25 |