C++ OpenGL纹理2d数组赢得';t使用深度渲染>;1.

C++ OpenGL纹理2d数组赢得';t使用深度渲染>;1.,c++,opengl,textures,C++,Opengl,Textures,下面的代码上载我的纹理内存,在传递的参数中描述。当“vPixelData”仅包含1个项目/纹理时,将正确渲染该项目/纹理,但一旦有2个或更多项目,则不会显示任何内容 仅当vPixelData.size()大于1时,当我在glGetError()之后调用它时,glTexSubImage3D()返回“GL\u INVALID\u OPERATION” /*virtual*/ uint32 HyOpenGL::AddTextureArray(uint32 uiNumColorChannels, uin

下面的代码上载我的纹理内存,在传递的参数中描述。当“vPixelData”仅包含1个项目/纹理时,将正确渲染该项目/纹理,但一旦有2个或更多项目,则不会显示任何内容

仅当vPixelData.size()大于1时,当我在glGetError()之后调用它时,glTexSubImage3D()返回“GL\u INVALID\u OPERATION

/*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;
}
/*virtual*/uint32-HyOpenGL::AddTextureArray(uint32-uinumColorChannel、uint32-uiWidth、uint32-uiHeight、vector和vPixelData)
{
GLenum eInternalFormat=UInumColorChannel==4?GL_RGBA8:(UInumColorChannel==3?GL_RGB8:GL_R8);
前庭盂=UInumColorChannel==4?GL_RGBA:(UInumColorChannel==3?GL_RGB:GL_红色);
glTexImage3D(GL_纹理_2D_数组,0,eInternalFormat,uiWidth,uiHeight,静态_转换(vPixelData.size()),0,eFormat,GL_无符号_字节,NULL);
胶合HGLTE射线;
glGenTextures(1,&hGLTextureArray);
//玻璃纹理(GL_纹理0);
glBindTexture(GL_纹理_2D_阵列,hGLTextureArray);
//为纹理创建存储
glTexStorage3D(GL_纹理_2D_阵列,
1,//mipmap的数量
eInternalFormat,//内部格式
uiWidth,uiHeight,//宽度,高度
静态_cast(vPixelData.size());
for(unsigned int i=0;i!=vPixelData.size();+i)
{
//将每个纹理写入存储器
glTexSubImage3D(GL_纹理_2D_阵列,
0,//Mipmap编号
0,0,i,//xoffset,yoffset,zoffset
uiWidth,uiHeight,1,//宽度,高度,深度(复制的纹理)
eFormat,//格式
GL\u无符号字节,//类型
vPixelData[i]);//指向像素数据的指针
GLenum eError=glGetError();//当纹理深度大于1时获取“GL\u无效操作”。否则为“GL\u无错误”
}
glTexParameteri(GL_纹理2D_数组、GL_纹理minu过滤器、GL_线性);
glTexParameteri(GL_纹理2D_数组,GL_纹理MAG_过滤器,GL_线性);
glTexParameteri(GL_纹理2D_数组、GL_纹理包裹、GL_夹紧到边);
glTexParameteri(GL_纹理2D_数组、GL_纹理包裹、GL_夹紧到边);
返回HGLTE后射线;
}
(我当前传递的参数是UINumColorChannel==4)


(uiWidth和uiHeight都是512)

显然,如果我使用:

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()));
glTexStorage3D(GL_纹理_2D_阵列,
1,//mipmap的数量
eInternalFormat,//内部格式
uiWidth,uiHeight,//宽度,高度
静态_cast(vPixelData.size());

如果您使用
KHR\u debug
,您可能会获得有关错误的更好信息,尽管它并不适用于所有地方。您使用的是什么版本的OpenGL
glTexStorage3D()
仅在4.2及更高版本中可用。
uiNumTextures
看起来不同于
static_cast(vPixelData.size())
me@RetoKoradi也许可以解释为什么它在一台机器上工作,而不是在这台机器上。@Derhas它们的值相同,我只是没有写出来。问题很可能是OpenGL的错误版本