2014-05-13 557 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()用於替換已經分配了圖像數據的部分或全部紋理。您必須在紋理上至少調用glTexImage2D()一次,然後才能使用glTexSubImage2D()。與glTexSubImage2D()不同,glTexImage2D()分配圖像數據。如果您只想分配圖像數據,則可以使用NULL作爲glTexImage2D()的最後一個參數(data),然後使用glTexSubImage2D()設置數據。

較新版本的OpenGL(4.4和ES 3.0)有一個新的入口點glTexStorage2D(),可用作glTexImage2D()的替代方法來爲紋理分配圖像數據而不指定數據。它類似於調用glTexImage2D()data = NULL,但也允許提前指定是否需要用於mipmap的空間。

+0

非常感謝。再見。 – user1364743