如何在OpenGL 3.2中使用GL_纹理_2D_数组

如何在OpenGL 3.2中使用GL_纹理_2D_数组,opengl,glsl,textures,Opengl,Glsl,Textures,因此,我尝试了以下步骤,但是我似乎无法让纹理2D数组正常工作 -(GLint)buildTextureArray:(NSArray *)arrayOfImages { GLImage *sample = [GLImage imageWithImageName:[arrayOfImages objectAtIndex:0] shouldFlip:NO]; //Creates a sample to examine texture width and height int width

因此,我尝试了以下步骤,但是我似乎无法让纹理2D数组正常工作

-(GLint)buildTextureArray:(NSArray *)arrayOfImages
{
    GLImage *sample = [GLImage imageWithImageName:[arrayOfImages objectAtIndex:0] shouldFlip:NO]; //Creates a sample to examine texture width and height
    int width = sample.width, height = sample.height;
    GLsizei count = (GLsizei)arrayOfImages.count; 

    GLuint texture3D;
    glGenTextures(1, &texture3D);
    glBindTexture(GL_TEXTURE_2D_ARRAY, texture3D);

    glPixelStorei(GL_UNPACK_ROW_LENGTH, width);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

    glTexParameteri(GL_TEXTURE_2D_ARRAY,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D_ARRAY,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D_ARRAY,GL_TEXTURE_WRAP_S,GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D_ARRAY,GL_TEXTURE_WRAP_T,GL_REPEAT);
    glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, width, height, count, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);

    int i = 0;
    for (NSString *name in arrayOfImages) //Loops through everything in arrayOfImages
    {
        GLImage *image = [GLImage imageWithImageName:name shouldFlip:NO]; //My own class that loads an image
        glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, i, image.width, image.height, 1, GL_RGBA, GL_UNSIGNED_BYTE, image.data);
        i++;
    }
    return texture3D;
}

//Setting Uniform elsewhere
glBindTexture(GL_TEXTURE_2D_ARRAY, textureArray);
glUniform1i(textures, 0);    


//Fragment Shader
#version 150

in vec3 texCoords;

uniform sampler2DArray textures;

out vec3 color;

void main()
{
    color = texture(textures, texCoords.stp, 0).rgb;
}
我可以加载具有相同纹理参数的单个纹理,但无法使用纹理2D数组。我得到的只是黑色的纹理。为什么会这样

glTexParameteri(GL_TEXTURE_2D_ARRAY,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
您的纹理实际上没有mipmap。所以不要再告诉OpenGL它是这样做的


另外,始终为纹理设置纹理。或者更好的方法是,使用它,它会为您提供帮助。

对于2d_数组纹理,texcoords的“v”分量从0高度变化,而“w”分量从0深度变化(因为它表示层)。尝试更改这些texcordinate。

可能是一个问题。。如果缩放使1个texel约占1个像素,您是否看到纹理?另外,你的p-tex坐标应该在0到arrayOfImages.size-1之间,有效吗?@Calvin1602不,我的整个屏幕都是黑色的,是的,出于当前测试目的,我的p-tex坐标都设置为0。如果要使用
GL\u-LINEAR\u-MIPMAP\u-LINEAR
请确保上载一些MIPMAP。我已更改了它,但仍然会出现黑屏。这可能是因为glPixelStore不支持GL_纹理_2D_数组吗?而且正如我在问题中所述,我正在使用OpenGL 3.2,所以纹理存储不受支持。@theAmateurProgrammer,嗯
glPixelStore
对任何
GL\u纹理\u 2D\u数组都一无所知,因此甚至没有“支持”的概念。当然,您必须正确设置它,以便将像素数据上载到GPU,您已经这样做了(尽管4对齐也可以,因为您使用RGBA数据)。等等,您的图像数据确实每个像素包含4个无符号字节,对吗?@ChristianRau我的图像数据应该每个像素包含4个无符号字节。如我在问题中所述,我能够使用相同的纹理参数和像素存储分别使用GL_TEXTURE_2D使用纹理。@Nicolas如果您没有注意到,我的代码是Objective-C,这是Mac OSX上OpenGL的一个巨大标志。下一次我发布另一个问题时,我会指出这一点。