이미지 텍스처
래스터라이저가 출력하는 프래그먼트별 애트리뷰트는 대체로 노멀과 텍스처 좌표를 포함한다. 이들을 이용해 프래그먼트 쉐이더는 색상을 계산한다. 그렇게 하기 위해서는 라이팅과 텍스처링이 필요한데, 8장에서는 텍스처링에 대해 다룬다.
텍스처는 일반적으로 배열 구조를 가지는데, 이 배열이 색상 정보를 저장하고 있다면 이를 이미지 텍스처라고 부른다. 텍스처는 텍셀로 구성된다. 각 텍셀 위치는 그 중심의 2차원 좌표로 표현이 가능하다.
위 이미지 (a)에서 왼쪽 아래 모퉁이 텍셀의 좌표는 (0.5, 0.5), 그 오른쪽 텍셀의 좌표는 (1.5, 0.5)이다.
텍스처링은 물체 표면에 벽지 바르듯 텍스처를 입히는 것이다.
(a)의 이미지가 원통면에 입혀진 것이 (b)인데, 이를 위해서는 원통면 폴리곤 메시의 각 정점마다 텍스처 좌표를 할당해야 한다. 이는 오프라인 모델링 단계에서 이루어진다.
2차원 텍스처 좌표는 보통 (s, t) 혹은 (u, v)로 표현하는데,
각 좌표는 원칙적으로 [0, 1] 범위 안에 정규화 되어 있다.
(a)의 스크린 공간 삼각형을 보면 세 정점에 각각 (0, 0), (1, 0), (0,1)의 텍스처 좌표가 주어졌다. 7장에서 배운 스캔 전환 알고리즘은 변을, 그 다음 스캔라인을 따라 텍스처 좌표를 보간한다. 완료되면 각각 프래그먼트는 보간된 (s, t) 좌표를 가지게 된다. 예를 들어 왼쪽 아래 끝 프래그먼트는 (1/8, 1/8) 좌표를 갖는다. (b)는 s, t축 방향 모두 정규화 된 파라미터 공간에서 (1/8, 1/8)의 상대적 위치 보여준다.
정규화된 텍스처 좌표(s, t)는 위와 같은 방식으로 실제 텍스처 공간으로 매핑된다. 이를 가리켜 투영되었다고 표현한다.
정규화된 텍스처 좌표를 이용한 텍스처링.
(a) 원통면 메시 각 정점마다 텍스처 좌표가 할당되었다.
(b) 원통면에 텍스처를 입혔다
(c) (a)에 보인 텍스처 좌표 그대로 사용하면서 원통면에 다른 텍스처 입혔다.
텍스처는 2차원으로 국한되지 않는다. CT, MRI 등과 같이 층층이 쌓인 영상은 3차원 텍스처에 해당한다. 이를 볼륨 텍스처라고 부른다.
표면 파라미터화
(표면) 파라미터화: 폴리곤 메시의 각 정점에 텍스처 좌표 (s, t)를 할당하는 작업
3차원 메시를 2차원 평면에 펼치는 작업이 필요하다.
하지만 3차원 메시를 2차원 평면에 펼치면 왜곡 현상이 발생하는데, 이를 최소화 해야한다.
(a)는 얼굴 패치에 대한 차트이고, (b)는 여러 차트를 하나의 텍스처에 모은 아틀라스이다.
GL에서의 텍스처 정의
텍스처의 구조체는 텍셀과 가로, 세로 값을 가지며 텍셀은 색상 값인 RGBA 값을 가진다.
- 텍스처 오브젝트 생성 위해 glGenTextures(GLsizei n, GLuint textures) 호출
- 특정 텍스처에 바인드하기 위해 glBindTextures 호출
- 텍스처 오브젝트를 실제 텍스처로 채우기 위해 glTexImage2D 호출
텍스처 포장
텍스처 좌표는 원칙적으로 [0, 1] 범위 안에서 정의되지만, GL은 그 범위 밖에서 좌표 지정을 허용하고 처리해 준다. 사용자는 텍스처 포장 모드를 설정해 그 처리 방식 조절이 가능하다.
경계 고정 모드: [0, 1] 범위 경계로 고정 시킨다.
반복 모드: 이미지 텍스처를 반복하는 방법. 범위 넘어서면 소수점 이하만 허용하여 좌표값을 재설정한다.
반사 반복 모드: 좌표값을 역으로 감소, 증가시키는 방법
텍스처 필터링
투영된 텍스처 좌표는 주변의 텍셀을 고려해서 해당 프래그먼트의 색상을 결정해야 하는데, 이를 텍스처 필터링이라고 부른다.
텍스처 확대
- 근접점 샘플링
- 겹선형보간 - 근접점 샘플링보다 부드러운 텍스처링 결과
(a)는 투영된 픽셀에 가장 가까운 텍셀에서 색상 가져옴
(b)는 투영된 픽셀을 둘러싼 네 개 텍셀의 색상을 겹선형보간함
텍스처 축소
(a) 모든 픽셀이 검은색 텍셀에 둘러싸이면 텍스처링 결과는 검은색으로 나타난다.
(b) 모든 픽셀이 회색 텍셀에 둘러싸이면 회색으로 나타난다.
에일리어싱: 고주파 신호를 낮은 빈도로 샘플링 할 때 발생하는 오류
앤티에일리어싱: 에일리어싱이 일으키는 부작용 최소화하는 기술
밉매핑
에일리어싱의 원인은 픽셀에 비해 텍셀이 너무 많아서 텍스처링에 참여하지 못하는 텍셀이 발생하기 떄문이다.
→ 텍스처를 작게 만들어 텍셀 수를 픽셀 수에 맞춰 해결한다.
다운 샘플링을 반복해 원본 텍스처 전체의 평균 색상을 담고 있는 1*1 크기 텍스처를 얻을 수 있다. 다음은 밉맵 생성을 보여주는 사진이다.
다운 샘플링 과정 계속해 거치다보면 여러 개의 텍스처를 만들어낼 수 있다. 이렇게 생긴 피라미드 구조 텍스처들을 밉맵이라고 한다.
밉맵 필터링
실제 픽셀은 스크린 공간 작은 ‘영역’을 뒤덮고 있다. 이 영역이 정사각형이라고 가정하면 정사각형 픽셀들이 전체 스크린을 타일처럼 뒤덮고 있는 것으로 생각할 수 있다. 따라서, 텍스처 공간에 투영된 픽셀은 (s', t')를 중심으로 일정한 영역을 차지하게 된다. 이 영역을 픽셀의 발자국이라고 부른다.
(a)의 예에서 0번 레벨 원본 텍스처는 스크린 공간 사각형의 16배의 크기를 가진다. (b)픽셀 발자국은 2번 레벨 텍스처에서 하나의 픽셀을 차지함
정수가 아닌 λ가 계산되면, 간단하게 λ에 가장 가까운 레벨을 선택하는 방법을 사용할 수 있다. (a)에서는 2번 레벨이 된다. 이 레벨은 근접점 샘플링 또는 겹선형보간을 통해 필터링될 수 있다. 각 레벨을 필터링한 결과를 선형 보간하는 것이 가장 좋은 방법인데, 삼선형 보간이라고 한다.
GL에서의 밉맵 필터링
사용자는 텍스처의 확대 및 축소가 될 때 텍스처를 어떻게 필터링해줄건지 정해야한다.
GL 밉매핑의 예시이다.
(a) 파란색 줄무늬 텍스처로 만들어진 밉맵.
glTexParameteri 함수로 텍스처 필터링 방법을 지정 가능하다.
pname 파라미터에 들어갈 값은 다음과 같다.
→ GL_TEXTURE_MAG_FILTER: 텍스처 확대
→ GL_TEXTURE_MIN_FILTER: 텍스처 축소
param 파라미터에는 다음과 같은 값이 들어간다.
→ GL_NEAREST: 원본 텍스처를 근접점 샘플링으로 필터링
→ GL_LINEAR: 원본 텍스처를 겹선형보간으로 필터링
- GL_NEAREST_MIPMAP_NEAREST: 밉맵에서 가장 가까운 레벨을 근접점 샘플링으로 필터링
- GL_LINEAR_MIPMAP_NEAREST: 밉맵에서 가장 가까운 레벨을 겹선형보간으로 필터링
- GL_NEAREST_NIPMAP_LINEAR
- GL_LINEAR_MIPMAP_LINEAR
→ GL_LINEAR_MIPMAP_LINEAR이 삼각형 보간 쓰기 가장 좋은 옵션
텍스처링을 위한 프래그먼트 쉐이더
텍스처링을 수행하는 프래그먼트 쉐이더이다. 래스터라이저가 출력하는 각 프래그먼트에 대해 한 번씩 실행된다.
쉐이더의 변수는 저/중/고 정밀도 중 하나를 가질 수 있다.
lowp, medlump, highp 키워드로 정의된다.
정밀도는 개별 GPU에 따라 달라짐.
텍스처링과 라이팅.
(a)는 두 가지 텍스처를 보여주고, (b)는 예제 코드의 프래그먼트 쉐이더가 이들을 사용해 텍스처링을 수행한 결과를 보여준다. 자세히 보면 모델 표면이 음영처리가 제대로 되지 않았는데, (c)에서는 구분이 명확하다. 이는 라이팅도 수행했기 때문이며, 9장에서 보도록 하겠다.
이미지 출처: [OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문]
위 서적을 보고 공부한 내용을 정리함
'컴퓨터 그래픽스' 카테고리의 다른 글
2024.7.14(일) - 10장 출력 병합기 (0) | 2024.07.14 |
---|---|
2024.7.13(토) - 9장 라이팅 (2) | 2024.07.14 |
2024.7.8(월) 7장 - 래스터라이저 (1) | 2024.07.14 |
2024.7.6(토) 6장 OpenGL ES와 쉐이더 (0) | 2024.07.12 |
2024.7.4(목) 5장 - 정점 처리 (0) | 2024.07.07 |