2013-10-05 4 views
0

내가출력 질감 코드에서 오는되지

float pixels[] = { 
0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 
1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f 
}; 
GLint texture; 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_FLOAT, pixels); 
glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
+0

순서가 맞지 않는 일을하고 있습니다. :) –

답변

0

glTexImage2D (...)는 현재 바인딩 텍스처 이름을 텍스처 이미지 데이터를 제공 어떤 질감을 받고 있지 않다 원인 사람이, 내가 주어진 코드를 잘못하고있는 무슨 말해 줄 수. 코드의 문제점은 텍스처 이름을 생성하고 바인딩하기 전에 텍스처 이미지 데이터를 업로드한다는 것입니다 (texture).

솔루션

은 매우 간단합니다 :
/* Use a GLuint for OpenGL handles by the way */ 
GLuint texture; 

glGenTextures (1, &texture); 
glBindTexture (GL_TEXTURE_2D, texture); 

/* After creating a texture name, and binding it, you have a valid context for 
* the following API call. 
*/ 
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_FLOAT, pixels); 

빠른 이미지 업로드를 들어, C 코드에 데이터를 저장하는 정수 기반의 데이터 형식을 사용하는 것이 좋습니다. GL_RGB 텍스처를 만들 때 OpenGL은 일반적으로 채널당 8 비트 고정 소수점을 사용하는 텍스처를 만들고, glTexImage2D (...)은 이미지 데이터를 업로드 할 때 픽셀 데이터 변환을 수행합니다. 이를 픽셀 전송 변환이라고하며 다른 채널 레이아웃 또는 기본 데이터 형식의 내부 형식 및 픽셀 전송 형식을 사용할 경우 glReadPixels (...)glTexImage2D (...) 등의 드라이버 오버 헤드가 증가합니다.

최신 버전의 OpenGL은 내부에서 사용할 정확한 형식을 지정하기도하므로 8 비트 고정 소수점을 보장하려면 내부 형식으로 GL_RGB8을 사용할 수 있습니다. 픽셀 전송을 위해 GL_RGBGL_UNSIGNED_BYTE을 연결하면 "빠른 경로"로 전환되며 OpenGL과 OpenGL ES (픽셀 전송 변환을 허용하지 않음) 사이에서 코드를 더 이식성있게 만듭니다.

RGB8은 처음에는 좋은 형식이 아니기 때문에 드라이버는 RGBx8에이 패드를 두어 하드웨어에서의 두 가지 맞춤 요구 사항을 충족시킬 수 있습니다. 사용할 수없는 저장 공간이 8 비트 추가되므로 RGBA8은 결국 더 잘 작동하고 RGB 이미지 형식을 사용하여 메모리를 절약하지 않는다는 것을 분명하게 알 수 있습니다. 1, 2 및 4 채널 이미지 형식의 구성 요소의 합계와 같은 저장 공간을 실제로 사용하는 소수의 3 채널 형식 (예 : GL_R11F_G11F_B10F​) 만 있으면 일반적으로 갈 수 있습니다.