본문 바로가기

Library/Computer Graphics

쉐이더 아키텍처를 사용하는 OpenGL 프로그래밍에서의 텍스처 매핑

OpenGL에서, 텍스처 매핑(texture mapping)을 사용하는 방법은 고정 처리 파이프라인(fixed pipeline)을 사용하느냐, 쉐이더 파이프라인을 사용하느냐 여부에 따라 달라진다. OpenGL 2.0 이전의 고정 파이프라인 구조에서는 명시적인 glActiveTexture() 사용이 중요한데, 이것은 여러 장의 텍스처를 사용하는 방법은 멀티 텍스처링이 유일하기 때문이다. 반면, 쉐이더 아키텍처를 사용하는 OpenGL 2.0 이후의 구조에서는 생성된 텍스처 개체의 바인딩 대상이 되는 텍스처 유닛과 샘플링 방법만 필요하다. 생성된 텍스처 개체를 바인딩했다면, 쉐이더의 샘플러에게는 어떤 텍스처 유닛이 사용될 것인지 전달하면 된다. 그리고, 이 부분이 가장 중요한데, 상태 설정을 위해 바인딩 되는 텍스처 유닛과 렌더링 과정에서 바인딩되는 텍스처 유닛은 상관이 없다.

OpenGL은 상태 머신(state machine)이다. 즉, 모든 OpenGL 개체들은 개체 생성 - 바인딩(binding) - 파라미터 설정 - 사용 - 언바인딩(unbinding) 과정을 거쳐야 하며, 텍스처 개체 역시 이 절차에 따라야 한다. 텍스처 개체에 텍스처 유닛의 샘플링 파라미터를 설정했다면, 활성화 된 텍스처 유닛은 텍스처 개체가 바인딩 될 때 이 정보를 이용하며 텍스처 샘플링을 수행한다. 어떤 텍스처 유닛을 활성할지는 glActiveTexture() 함수를 사용하여 지정할 수 있다. 쉐이더 코드의 샘플러 변수가 가지는 값은 텍스처 개체의 ID가 아니라, 텍스처 유닛이다.

텍스처 개체를 설정하고 사용하는데 중요한 점 또 하나는, 텍스처 개체를 텍스처 유닛으로부터 언바인딩하면 그 텍스처 개체는 텍스처 유닛으로부터 아무런 관련이 없어진다는 점이다. glBindTexture(GL_TEXTURE_nD, 0)과 같은 명령으로 텍스처 개체를 텍스처 유닛으로 언바인딩하면 텍스처 유닛은 초기화 상태로 되돌아가게 되며, 텍스처 유닛이 어떻게 동작하는가에 대한 정보는 설정된 텍스처 개체가 가지게 된다. 텍스처를 정확하게 설정하기 위해서는 텍스처 유닛에 텍스처를 바인딩하여 설정하고, 같은 텍스처 유닛을 사용하여 다른 텍스처 개체를 설정하려고 한다면 반드시 해당 텍스처 유닛으로부터 이전 텍스처 개체를 언바인딩해야 한다.