프로그래밍/OpenGL

텍스처의 기본

이재만박사 2016. 2. 15. 14:07

* 텍스처 맵을 지오메트리에 적용 단계


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