* 텍스처 맵을 지오메트리에 적용 단계
1. 텍스처를 메모리 내에 로딩
- 로딩이 된 후에 텍스처는 현재 텍스처 상태의 일부
void glTexImage2D(GLenum target, GLint level, GLint innerFormat,
GLsizei width, GLsizei height, GLint bound,
GLenum format, GLenum type, void* data)
- 텍스처 맵을 로딩하는데 사용
- 이 함수들이 호출되면 텍스처 정보가 OpenGL에 의해 복사
- 많은 자원을 필요로 함
- 텍스처 개체 섹션에서 살펴봄
target : GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D
level : 밉맵 레빌 지정하는데 사용
밉맵을 사용하지 않는 일반 텍스처는 0으로 설정
innerFormat : 텍셀 당 얼만큼의 색상 요소를 저장, 저장 크기, 압축 여부
GL_ALPHA, GL_LUMINANCE, GL_LUMINANCE_ALPHA,
GL_RGB, GL_RGBA
width, height : 텍스처의 차원, 2의 제곱수로 지정
bound : 텍스처 맵의 테두리 두께를 지정하는데 사용
텍스처 맵의 경계 부근에 추가적인 너비, 높이를 더해 확장해 나감
텍스처 필터링에도 중요한 부분
0으로 설정하면 테두리가 없는 상태가 됨
format : GL_RGB, GL_RGBA,
GL_BGR/GL_BGR_EXT, GL_BGRA/GL_BGRA_EXT
type : GL_UNSIGNED_BYTE, GL_BYTE,
GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT,
GL_UNSINGED_INT, GL_INT,
GL_FLOAT
data : 실제 사용할 데이터 버퍼 포인터
로딩된 텍스처는 적절한 텍스처 상태의 설정이 있어야만 적용 가능
glEnable( GL_TEXTURE_2D );
- 각 텍스처 상태는 한 번에 하나씩만 사용
* 1차원과 2차원 텍스처의 경우 색상 버퍼에서 로딩
void glCopyTexImage2D(GLenum target, GLint level, GLenum innerFormat, int x, int y,
GLsizei width, GLsizei height, GLint bound);
* 텍스처 업데이트
이미 사용한 텍스처에서 새로 변경될 부분만 바꾸는 것
glTexSubImage2D(GLenum target, GLint level,
GLint xoffset, GLint yoffset,
GLsizei width, GLsizei height,
GLenum format, GLenum type, const GLvoid* data);
* 텍스처와 지오메트리 맵핑
- 텍스처 사용을 가능하도록 설정 : glEnable(GL_TEXTURE_2D)
- 텍스처 로딩 : glTexImage2D( ... )
모든 기본 모델에 텍스처 적용이 가능한 상태
- 하지만 이러한 텍스처를 지오메트리에 어떻게 적용할 것인가를 OpenGL에 전달
- 각 버텍스에 대해 텍스처 좌표를 지정하는 과정이 필요
- 텍스처 맵 내의 텍셀은 픽셀 맵과 같이 메모리 내의 위치로 지정되는 것이 아니라 추상적인 실수 값으로 지정( 0.0 ~ 1.0 )
* 텍스처 좌표의 지정
glTexCoord2f( GLfloat s, GLfloat t )
- 이 함수를 통해 각 버텍스에 대한 텍스처 좌표 적용이 끝나면 OpenGL은 텍스처를 늘리거나 줄여서 지오메트리에 맞게 끔 조절
- 이 조절은 텍스처 필터를 이용해서 이루어짐
* 텍스처 행렬
- 텍스처 좌표 역시 텍스처 행렬을 통해 변환 가능
glMatrixMode(GL_TEXTURE)
텍스처 행렬 개수는 2개
* 좌표 래핑, 텍스처 필터, 텍스처 환경
* 텍스처 환경
- 예제에서 흰색 재질 속성으로 일단 면이 그려진 후 텍스처가 적용
- 텍셀의 색상과 지오메트리 색상을 OpenGL이 어떻게 결합하는가를 결정
glTexEnv( GLenum target, GLenum pname, GLfloat param)
- target : 정의할 텍스처 환경
GL_TEXTURE_ENV, GL_TEXTURE_FILTER_CONTROL
- pname : 정의할 인자 이름
GL_TEXTURE_FILTER_CONTROL 일 경우 인자 이름은 GL_TEXTURE_LOD_BIAS가 되어야 함,
인자의 값은 밉맵 레벨 선택에 대한 bias 값이어야 한다
- GL_TEXTURE_ENV 일 경우 인자의 이름은 GL_TEXTURE_ENV_MODE 일 경우 사용할 수 있는 인자는 GL_REPLACE, GL_DECAL, GL_MODULATE, GL_BLEND, GL_ADD, GL_COMBINE 이 있다
Ct : 텍스처 컬러 At : 텍스처 알파
Cf : 프래그먼트 컬러 Af : 프래그먼트 알파
C : 결과값 컬러 C : 결과값 알파
- GL_DECAL : C = Cf * (1 - At) + Ct * At A = Af
지오메트리에 적용되는 텍셀 값, 블렌딩이 사용되고 텍스처에 알파 채널이 있을 경우 현재 블렌딩 함수에 따라 텍스처와 지오메트리의 색상이 블렌딩
- GL_REPLACE : C = Ct A = At
지오메트리의 색상을 데체하는 텍셀 값. 블렌딩이 사용되고 텍스처에 알파 채널이 있을 경우 텍스처의 알파 값이 색상을 대체하는데 사용
- GL_MODULATE : C = Ct * Cf A = At * Af
텍셀의 색상값을 지오메트리의 색상값과 곱함
- GL_ADD : C = Ct + Cf A = At + Af
텍셀의 색상값이 지오메트리의 색상 값과 더해짐
* 기본 필터링
- 텍스처가 지오메트리에 적용될 때는 텍스처 맵의 텍셀과 화면의 픽셀 간 1:1 대응이 이루어지는 경우는 거의 없다
- 텍스처가 화면에 나타날 방식을 조심스럽게 계획하고 조절
- 텍스처 이미지는 늘리거나 줄여서 화면에 표현되는 것이 일반적이므로
지오메트리의 방향에 따라 텍스처가 조절
- 필터링 : 늘려지거나 줄여진 텍스처 맵으로부터 색상요소를 계산하는 과정
glTexParameteri( GLenum target, GLenum pname, GLint param )
- target : 인자가 적용될 텍스처 타겟
GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D, GL_TEXTURE_CUBE_MAP
- pname : 설정할 텍스처 인자
GL_TEXTURE_MIN_FILETER : 텍스처 이미지 축소 방식이나 필터 지정
GL_TEXTURE_MAG_FILETER: 텍스처 이미지 확대 방식이나 필터 지정
GL_TEXTURE_WRAP_S : 텍스처 좌표 s가 0.0에서 1.0 범위 외부에 있을 때 제어하는 방식
GL_TEXTURE_WRAP_T : 텍스처 좌표 t가 0.0에서 1.0 범위 외부에 있을 때 제어하는 방식
- param : 지정된 인자의 값
GL_LINEAR, GL_NEAREST, GL_CLAMP, GL_REPEAT