Threejs에서는 다양한 재질을 지원한다.
Texture
는 간단한게 설명하면 Object에 적용하는 그림들을 말한다. Material에는 보통 Color로 색상을 정하지만 색상을 대신하여 그림을 지정할 수 있는데 이 때 사용하는 그림이 Texture이다.
이때, Texture를 Object의 어느 위치에 어떻게 적용할지 설정하는 행위를 Texture Mapping이라고 한다.
Texture Mapping
Texture Mapping을 하는데는 Texture와 Texture가 놓일 Vertex 좌표가 필요하다. 예를 들어 삼각형에 Texture Mapping을 할 경우 3개의 Vertex(접점)의 위치가 필요한 것이다. 이 처럼 Texture Mapping하기 위해 Vertex의 좌표를 Threejs에게 알려주면 내부적으로 좌표에 위치한 이미지를 뽑아 적용한다. 여기서 좌표에 해당하는 이미지 색상을 추출하는 행위를 Texture Sampling
이라고 한다.
// 삼각형에 Texture Mapping을 하기 위해 아래 3개의 좌표가 필요하다.
float texCoords[] = {
0.0f, 0.0f, // lower-left corner
1.0f, 0.0f, // lower-right corner
0.5f, 1.0f // top-center corner
};
이런 의문점이 있다.
위의 삼각형 사진처럼 좌표는 일반적으로 (0,0)에서 (1,1)까지이다. 하지만 범위 밖의 좌표를 지정하게 되면 은 어떻게 인식하게 될까?
기본 동작은 텍스처 이미지를 반복하는 것이다
하지만 옵션을 설정하면 다양한 방식으로 이미지를 반복할 수 있다.
텍스처 좌표는 해상도에 의존하지 않지만 부동 소수점 값이 될 수 있으므로 텍스처 좌표를 매핑할 텍스처 픽셀을 찾아야한다. (texel이라고도 한다) 매우 큰 물체와 낮은 해상도의 텍스처가 있는 경우 특히 중요
하다. 이를 위한 텍스처 필터링 옵션이 있다.
가장 중요한 옵션은 GL_NEAREST(가장 가까운 이웃 필터링) 및 GL_LINEAR(선형 필터링)
GL_NEAREST(가장 가까운 이웃 필터링)
GL_LINEAR(선형 필터링) : 인접한 픽셀의 혼합 색상이 반환됨
밉맵(mipmap)은 렌더링 속도를 향상시키기 위한 목적으로 기본 텍스처와 이를 연속적으로 미리 축소시킨 텍스처들로 이루어진 비트맵 이미지의 집합
아래 그림처럼 밉맵 집합의 각각의 비트맵 이미지는 기본 텍스처를 일정한 수준만큼 미리 축소한 것이다
또한, 앤티에일리어싱 처리가 되어 있으므로 렌더링 과정에서 일어날 수 있는 손실이 준다.
Loading and creating textures
이미지 형식을 큰 바이트 배열로 변환하는 자체 이미지 로더를 작성(stb_image.h 사용)
보통 Texture를 생성한 후 Mipmaps 자동 생성 됨
Texture와 Mipmaps를 생성한 후 메모리 해제 필요
Applying textures
접점, 색상, 위치를 알려주어야 한다.