Graphics Programming

glTexImage2D()와 glTexStorage2D()의 차이 본문

Season 1/OpenGL

glTexImage2D()와 glTexStorage2D()의 차이

minseoklee 2016. 10. 17. 02:46

텍스처를 생성하면 크기와 포맷을 지정해야 한다. 그런데 두 가지 방법이 있다.


// 텍스처 생성

GLuint tex;

glGenBuffers(1, &tex);


// 바인딩

glBindTexture(GL_TEXTURE_2D, tex);


// 방법 1. glTexImage2D() 또는 glTexSubImage2D()

// 타겟, 밉맵 레벨, 텍스처 포맷, 가로, 세로, 보더, 집어넣을 데이터의 포맷, 타입, 실제 데이터

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);


// 방법 2. glTexStorage2D()

// 타겟, 밉맵 레벨, 텍스처 포맷, 가로, 세로

glTexStorage2D(GL_TEXTURE_2D, 0, GL_RGBA, 512, 512);


glTexImage2D()는 텍스처의 포맷과 크기를 지정하면서 동시에 텍스처에 데이터를 기록할 수 있다. (마지막 세 인자) 나중에 이 함수를 다시 호출하는데 텍스처 포맷과 크기를 다르게 설정할 수 있다. 즉 tex에 512x512 텍스처를 할당했다가 나중에 1024x1024 텍스처를 재할당할 수가 있다.


glTexStorage2D()는 반면 텍스처의 크기와 포맷만 지정한다. 이 함수로 어떤 텍스처의 크기와 포맷을 한 번 설정하면 이후 변경 불가능하다. 텍스처에 이미지를 채우려면 glTexSubImage2D()를 사용한다.


그럼 glTexStorage2D()가 있는데 왜 glTexImage2D()가 필요할까? glTexImage2D()와 glTexSubImage2D()는 OpenGL 2.0부터 지원되었다. 하지만 glTexStorage2D()는 OpenGL 4.2가 되어서야 등장했다. 이전에는 glTexImage2D()를 쓸 수 밖에 없었던 것이다.


이제 glTexStorage2D()가 있다고 glTexImage2D()가 deprecated 처리된 것은 아니다. glTexStorage2D()로 지정한 포맷과 크기는 변경 불가능하기 때문에 glTexImage2D()만이 원하는 작업을 할 수 있는 경우가 있기 때문이다.


둘 다 목적에 맞는다면 좀 더 깔끔한 glTexStorage2D()를, glTexImage2D()가 필요한 상황이라면 glTexImage2D()를 쓰면 되겠다. 실제 렌더링할 때 둘 중 무엇을 사용하던 텍스처 읽기 성능에는 차이가 없다는 것 같다. (링크: 관련 글)

Comments