티스토리 뷰
고려대학교 정보대학 컴퓨터학과 2019년 1학기 <컴퓨터그래픽스> 8강 이미지텍스처링
강의영상 플레이리스트 [Link]
강의자료 [Link]
컴퓨터그래픽스 이미지텍스처링
Keywords
- texel vs. pixel
- texture coordinates
- surface parameterization (parameterization)
- chart vs. atlas
- texture wrapping
- texture filtering - magnification & minification
- alias and anti-alias
- mipmapping
Where are we?
이전 강의까지 vertex shader - rasterizer 파이프라인을 학습하였음
resterizer는 최종적으로 fragments를 반환하며, 각 fragment에는 노말과 텍스쳐 좌표 정보가 포함
fragment shader는 노말과 텍스쳐 좌표 정보를 사용해서 각 fragment에 대한 최종적인 색상을 결정
Texture Coordinates
texel vs. pixel
* texel = texture element = 텍스쳐의 2D 좌표로 표현되는 요소* pixel = picture element = 픽셀의 2D 좌표로 표현되는 요소
screen space의 픽셀과 좌표계가 혼동될 수 있으므로 텍스쳐는 texel로 표현함
texel의 위치 정보(location)는 중심점좌표로 표현될 수 있음
텍스쳐링 수행 시, 텍스쳐 좌표 \((s,t)\)를 "모델링 단계에서" 폴리곤 메쉬의 각 vertex에 할당하게 됨
* rasterizer는 각 fragment에 대해 bilinear interpolation 통해 텍스쳐 좌표 \((s,t)\)를 구하여 할당
* 텍스쳐 좌표 \((s,t)\)는 원본 texture space에 project 됨 : "가로해상도 \(r_x\) / 세로해상도 \(r_y\)"
* project를 통해 얻은 원본 texture space 좌표에 대응하는 RGB값을 해당 텍스쳐좌표 \((s,t)\)에 할당
$$s'=s\times r_x$$
$$t' = t\times r_y$$
텍스쳐 좌표는 0~1 사이로 normalize 하는 것이 관례.
normalize 된 텍스쳐 좌표는 텍스쳐 해상도와 독립적이며, 따라서 다양한 텍스쳐에 적용하는 것이 가능하다
(예시: 5x5 해상도 텍스쳐 vs. 7x7 해상도 텍스쳐 - 해상도와 상관없이 중앙 색상을 가져오게 된다)
Surfface Parameterization
"모든 정점마다 \((s,t)\)를 할당한다" = surface parameterization (parameterization)+unfolding a 3D surface onto a 2D planar domain
시각화 + 설명* 3D 원통을 2D 면으로 펼친 다음에 범위를 구하고 비율에 맞춰서 \((s,t)\)를 할당한다.* 3D 인체 얼굴의 경우 "곡면을 평면화하는" 알고리즘을 적용해 2D 면으로 펼친 다음, 마찬가지로 범위를 구하고 비율에 맞춰서 \((s,t)\)를 할당한다.
Chart and Atlas
폴리곤 메쉬 패치(조각)의 이미지 텍스쳐 = chart
여러 개의 chart를 상위 텍스쳐로 묶으면 = atlas
Texture Wrapping
텍스쳐 좌표는 [0,1] normalize가 관례이지만 반드시 필요한 것은 아님
-> texture wrapping은 범위 바깥에 위치하는 텍스쳐좌표 \((s,t)\)를 처리한다
-> 특정 패턴 이미지를 반복적으로 적용하고자 할 때 [0,1] 범위를 넘어서야 하기 때문
- Clamp-to-Edge : 범위 밖 좌표는 경계선 edge 색상값 적용
- Repeat : 정수부 무시하고 소수점 기준으로 색상값 적용 (0.1, 0.3) == (1.1, 1.3)
- Mirrored-Repeat : 경계를 기준으로 색상이 크게 변화하는 Repeat 단점 보완 위해 gradation 방식 적용
Texture Filtering - Magnification & Minification
\((s', t')\)가 항상 텍셀 정중앙으로 대응되는 경우는 극히 드물다.
주변 텍셀 정보를 수집, 조합하여 fragment 색상을 결정하는 기법 = texture filtering
Magnification : pixel보다 fragment(pixel)가 많다
(fragment - 200x200 / texel - 100x100일 경우, texel < pixel)
그 반대의 경우 (texel > pixel): minification
Filtering for Magnification
Option 1: Nearest point sampling -> 여러 픽셀로 구성된 블록을 하나의 텍셀에 매핑 = 여러 픽셀에 동일한 텍스쳐 컬러 할당
-> "blocky image" (경계가 뚝뚝 잘린 듯한 이미지)
Option 2 : Bilinear interpolation
픽셀 주변의 4개 텍셀에 대해 bilinearly interpolation
-> 경계선에 위치한 픽셀이 다른 텍스쳐 컬러를 할당받으므로 blocky 문제가 적게 발생함
Filtering for Minification
texel > pixel
* Aliasing 문제: 고주파 신호를 더 낮은 해상도로 샘플링할 때 발생하는 샘플링 오류 -> alias artifact
* alias artifact를 줄이기 위한 anti-aliasing 기법 적용 필요함
Mipmap
Aliasing problem in minification --- texel > pixel
실제 스크린에 표현될 점(pixel) 하나에 너무 많은 texel들이 관여하는 상황. 어떻게 할까?
simple solution : down-sampling for decreasing the texture size (divide factor = 2)
원본을 최하단 level 0으로 하고, level 1 증가에 따라 scale 2로 작아지는 여러 면이 위로 쌓아올려지는 피라미드 구조를 mipmap이라고 부른다.
텍스쳐 스페이스로 프로젝션된 픽셀은 하나의 점이 아니라 \((s',t')\)를 중심으로 하는 영역(면)
-> 이러한 영역 = footprint of the pixel
아래 예시에서 픽셀 풋프린트는 LOD level 0에서 2x2 텍셀 영역이지만, LOD level 1에서는 하나의 텍셀에 대응
-> 픽셀 풋프린트가 level-0 텍스쳐의 \(m\times m\) 텍셀을 차지할 때, \(\lambda\)는 \(log_{2}m\)으로 설정한다.
\(\lambda=log_{2}2^{2}=2\)
깔끔한 예시, level-2에서 픽셀 풋프린트가 단일 텍셀에 대응한다.
\(\lambda=log_{2}3=1.585...\)
깔끔하게 계산되지 않는다 -> floor or ceil 선택의 문제가 발생함
1. Nearest level 접근 (하나를 취한다)
2. Floor + Ceil 모두를 써서 선형보간 필터링
2번 접근에서 bilinear interpolation을 사용할 경우, 가로/세로 축에 대한 선형보간에 더하여 texture space의 축에 대한 선형보간이 추가 실시되므로, 이를 trilinear interpolation이라고 부른다.
* Floor / Ceil 중에서, 가까이 있는 텍스쳐 컬러 \(e_{2}\)에 더 많은 가중치가 부여된다.
* 일반적으로 trilinear interpolation의 텍스쳐링 결과가 가장 좋다.
Mipmap in application?
* pixel footprint는 서로 동일한 경우가 거의 없다 - 임의의 다각형
* 하나의 폴리곤 메쉬더라도 어떤 fragment는 minification(pixel < texel, 하나의 픽셀에 여러 텍셀이 관여함), 어떤 fragment는 magnification(pixel > texel, 여러 픽셀에 하나의 텍셀이 관여함)이 필요하다 (픽셀-텍셀 양상이 따로따로)
Vertex and Fragment Shaders
텍스쳐는 왜 별도의 인풋으로 받지 않을까?
텍스쳐링을 수행하는 fragment shader에서는 동일 텍스쳐가 모든 프래그먼트에 동일하게 사용하므로, uniform으로서 제공된다.
(* Vertex shader에서 world transform이 uniform으로 제공되는 것과 동일한 맥락)
Fragment shader는 여러 개의 색상을 출력할 수도 있지만, 개론 입문 단계에서는 하나의 색상만 출력하는 내용만 다룬다.
Fragment shader의 텍스쳐링 파트에서는 이전 단계에서 넘겨주는 vertex normal을 사용하지 않고 texture coordinates만 쓴다.
Texturing Examples
텍스쳐링에서는 vertex normal을 사용하지 않음, 라이팅 단계에서 vertex normal을 사용하게 된다.
'3D Computer Graphics > Learnings' 카테고리의 다른 글
컴퓨터그래픽스_라이팅(2) (0) | 2022.05.06 |
---|---|
컴퓨터그래픽스_라이팅(1) (0) | 2022.05.04 |
컴퓨터그래픽스_래스터라이저(2) (0) | 2022.04.30 |
컴퓨터그래픽스_래스터라이저(1) (0) | 2022.04.27 |
컴퓨터그래픽스_OpenGL ES와 셰이더 (0) | 2022.04.26 |
- Total
- Today
- Yesterday
- PoseNet
- 3d affine transform
- vertex shader
- 원유로필터
- 메타버스
- 컴퓨터그래픽스 강의
- 컴퓨터그래픽스 좌표계와 변환
- 고려대학교 한정현
- tensorflow.js
- 컴퓨터그래픽스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |