2013-11-20 12 views
4

이것은 이상한 질문이지만 왜 glTexImage2d가 픽셀 데이터 형식과 Null 데이터 형식을 고려해야하는지 궁금합니다. glTexImage2d의 서명이glTexImage2d 및 Null 데이터

void glTexImage2D(GLenum target, GLint level, GLint internalFormat, 
      GLsizei width, GLsizei height, GLint border, GLenum format, 
      GLenum type, const GLvoid * data); 

internalFormat는 GPU에서 같은 데이터 형식을 저장하고 GLvoid에서 무엇을 기대하는 그래픽 드라이버에게 입력 원하는 그래픽 드라이버에게 역할입니다 ... * 데이터 . 그래서, 예를 들어 null을 전달하여 어떤 데이터도 전달하지 않으면 그래픽 드라이버가 형식과 형식을 신경 써야하는 이유는 무엇입니까? 때때로 이것은 그렇지 않기 때문에 이것은 이상한 질문입니다. 시간이 있고 모든 반복을 체크하지는 않았지만 깊이있는 텍스처를 만들 때 특히 그렇습니다. 또는 최근에 건너 왔던 부분은 GL_RED_INTEGER, GL_RG_INTEGER 등과 같은 Integer 유형 및/또는 해당하는 부분입니다. GL_R8I, GL_RGBA32UI와 같은 internalFormats. 반면, "단순한"유형은 GL_RGBA8, GL_RGBA32F 등과 같이 internalFormat에 반드시 대응할 필요가 없습니다. 몇 가지 이유로 이전의 특정 데이터 유형과 형식은 전달하지 않아도 정확해야합니다 모든 데이터. 왜 그런가요?

답변

2

아무런 데이터도 전달하지 않으면 계속 사용하기 위해 GPU에 메모리를 할당합니다. 그래서 정확한 형식을 지정해야합니다. GPU에 얼마나 많은 메모리를 예약해야하는지 알려줍니다.

+1

이전 버전의 구현에서 정확한 포맷을 지정하지 않고도 빠져 나올 수 있습니다. 즉,'int' 대신'GLint'로 선언됩니다. GLenum'은 *** (GL 2.x)에 익숙하기 때문에 (http://www.opengl.org/sdk/docs/man2/xhtml/glTexImage2D.xml) 1,2를 사용할 수 있기 때문에 , GL에 텍스쳐 이미지가 필요한 컴포넌트의 수를 알려주는'internalFormat'을위한 3 또는 4. –

2

glTexImage2D (...)을 호출 할 때 두 가지 형식, 내부 형식 및 픽셀 전송에 사용되는 형식이 있습니다. 내부 포맷은 텍스처를위한 저장 공간을 할당하는 데 필요합니다. 픽셀 전송 포맷은 GL이 픽셀의 (선택적인) 배열을 해석하는 데 사용됩니다.

픽셀 데이터에 NULL을 전달하면 픽셀 전송이 발생하지 않으므로 formattype이 필요하지 않을 것입니다. 기술적으로는이 경우 불필요하지만 GL은 형식 및 유형의 쌍을 유효하게합니다. 실제로 픽셀 전송 작업이 발생하지 않으므로 원하는 값 쌍을 사용할 수 있습니다. 모두 당신이하고있는 것은 텍스처 스토리지를 할당하는 것뿐입니다.

덧붙여서 glTexStorage2D (...)은 픽셀 전송없이 텍스처 저장소를 할당하는 현대적인 방법입니다. 이 방법으로 불변의 텍스처를 만들 수 있습니다.이 경우 실수로 glTexImage2D (...) 호출로 텍스처 LOD를 실수로 다시 정의 할 수 없습니다. glTexStorage2D (...)으로 텍스처 스토리지를 할당 한 후 glTexSubImage2D (...)을 호출하여 데이터를 공급할 수 있습니다.