2014-05-13 5 views
3

아주 간단한 OpenGL 응용 프로그램을 작성했습니다. 그 목표는 텍스처를로드하여 평면에 그립니다. 'glTexSubImage2D'함수를 사용하면 평면이 텍스처링되지 않고 'glGetError'함수가 '1281'(잘못된 값) 오류를 반환합니다. 그러나 'glTexImage2D'함수를 사용하면 비행기 평면이 올바르게 텍스처 처리됩니다 (오류가 없습니다).glTexSubImage2D가 올바르게 작동하지 않습니다.

void core::RootDevice::LoadTexture(char const *pFileName) 
{ 
    SDL_Surface *pSurface = IMG_Load(pFileName); 
    char *pPixels = reinterpret_cast<char*>(pSurface->pixels); 
    uint32_t bytePerPixel = pSurface->format->BitsPerPixel; 

    glGenTextures(1, &textureId); 
    glBindTexture(GL_TEXTURE_2D, textureId); 
    { 
     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pboID); 
     { 
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

      //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, pSurface->w,  //NO ERROR : All is ok 
       //pSurface->h, 0, GL_RGB, GL_UNSIGNED_BYTE, pPixels); 

      glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, pSurface->w,  //ERROR : 1281 
       pSurface->h, GL_RGB, GL_UNSIGNED_BYTE, pPixels); 

      std::cout << glGetError() << std::endl; 
      getchar(); 
     } 
     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); 
    } 
    glBindTexture(GL_TEXTURE_2D, 0); 
} 

그리고 렌더링 코드 : 여기

는 내 코드의 조각이다

void core::RootDevice::Render(void) 
{ 
    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, textureId); 
    { 
     glBegin(GL_QUADS); 
      glTexCoord2f(0.0f, 0.0f); 
      glVertex3f(-1.0f, -1.0f, 0.0f); 
      glTexCoord2f(1.0f, 0.0f); 
      glVertex3f(1.0f, -1.0f, 0.0f); 
      glTexCoord2f(1.0f, 1.0f); 
      glVertex3f(1.0f, 1.0f, 0.0f); 
      glTexCoord2f(0.0f, 1.0f); 
      glVertex3f(-1.0f, 1.0f, 0.0f); 
     glEnd(); 
    } 
    glBindTexture(GL_TEXTURE_2D, 0); 
} 

그리고 그 결과는 다음과 같다 :

enter image description here

사람이 도움을 줄 수 있습니까 나를?

답변

6

glTexSubImage2D()은 이미 이미지 데이터가 할당 된 텍스처의 일부 또는 전부를 대체하는 데 사용됩니다. glTexSubImage2D()을 사용하기 전에 텍스처에 적어도 glTexImage2D()으로 전화해야합니다. glTexSubImage2D()과 달리 glTexImage2D()은 이미지 데이터를 할당합니다. 이미지 데이터를 할당하고 나중에 glTexSubImage2D()으로 데이터를 설정하려는 경우 glTexImage2D()에 대한 마지막 (data) 인수에 NULL을 사용할 수 있습니다.

최신 버전의 OpenGL (4.4 및 ES 3.0)은 데이터를 지정하지 않고 텍스처에 이미지 데이터를 할당하기 위해 glTexImage2D() 대신에 사용할 수있는 새로운 진입 점 glTexStorage2D()을 가지고 있습니다. glTexImage2D()data = NULL으로 호출하는 것과 비슷하지만 밉맵을위한 공간이 필요할 경우 미리 지정하는 것도 허용됩니다.

+0

대단히 감사합니다. 안녕. – user1364743