2016-02-12 59 views
0

下面的代碼會上傳我在所傳遞的參數中描述的紋理內存。當'vPixelData'只保存1個物品/紋理時,它會被正確渲染,但是一旦出現2個或更多任何東西都不會顯示出來。OpenGL紋理二維數組將不會以深度> 1進行渲染

glTexSubImage3D()將返回 'GL_INVALID_OPERATION' 當我打電話glGetError()後,只有當vPixelData.size()大於1

/*virtual*/ uint32 HyOpenGL::AddTextureArray(uint32 uiNumColorChannels, uint32 uiWidth, uint32 uiHeight, vector<unsigned char *> &vPixelData) 
{ 
    GLenum eInternalFormat = uiNumColorChannels == 4 ? GL_RGBA8 : (uiNumColorChannels == 3 ? GL_RGB8 : GL_R8); 
    GLenum eFormat = uiNumColorChannels == 4 ? GL_RGBA : (uiNumColorChannels == 3 ? GL_RGB : GL_RED); 

    glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, eInternalFormat, uiWidth, uiHeight, static_cast<uint32>(vPixelData.size()), 0, eFormat, GL_UNSIGNED_BYTE, NULL); 

    GLuint hGLTextureArray; 
    glGenTextures(1, &hGLTextureArray); 
    //glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D_ARRAY, hGLTextureArray); 

    // Create storage for the texture 
    glTexStorage3D(GL_TEXTURE_2D_ARRAY, 
        1,      // Number of mipmaps 
        eInternalFormat,  // Internal format 
        uiWidth, uiHeight,  // width, height 
        static_cast<uint32>(vPixelData.size())); 

    for(unsigned int i = 0; i != vPixelData.size(); ++i) 
    { 
     // Write each texture into storage 
     glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 
         0,          // Mipmap number 
         0, 0, i,        // xoffset, yoffset, zoffset 
         uiWidth, uiHeight, 1,     // width, height, depth (of texture you're copying in) 
         eFormat,        // format 
         GL_UNSIGNED_BYTE,      // type 
         vPixelData[i]);       // pointer to pixel data 

     GLenum eError = glGetError(); // Getting 'GL_INVALID_OPERATION' when > 1 texture depth. It's 'GL_NO_ERROR' otherwise 
    } 

    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

    return hGLTextureArray; 
} 

(我現在傳遞的參數是uiNumColorChannels == 4)

(uiWidth和uiHeight均爲512)

+0

您可能會收到有關錯誤的更好的信息,如果你使用'KHR_debug',雖然它不是隨處可見。 –

回答

0

很顯然,如果我使用一切正常:

glTexImage3D(GL_TEXTURE_2D_ARRAY, 
      0, 
      eFormat, 
      uiWidth, uiHeight, 
      uiNumTextures, 
      0, 
      eFormat, 
      GL_UNSIGNED_BYTE, 
      NULL); 

代替:

glTexStorage3D(GL_TEXTURE_2D_ARRAY, 
        1,      // Number of mipmaps 
        eInternalFormat,  // Internal format 
        uiWidth, uiHeight,  // width, height 
        static_cast<uint32>(vPixelData.size())); 
+1

你使用的是什麼版本的OpenGL? 'glTexStorage3D()'僅在4.2及更高版本中可用。 –

+0

'uiNumTextures'看起來不同於'static_cast (vPixelData.size())'給我 – derhass

+0

@ReetoKoradi可能解釋了它爲什麼在一臺機器上工作,而不是這個。 – Balk