如何在OpenGL 3.2中使用GL_TEXTURE_2D_ARRAY

5

我尝试按照文档的指导操作,但似乎无法成功使用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数组中使用它。所有我得到的只是一个黑色的纹理。为什么会发生这种情况?


可能是mipmaps的问题。如果您缩放使得1个纹素大约占据1个像素,那么您是否能看到纹理?此外,您的p_tex_coord 应该在0和arrayOfImages.size-1之间,这是有效的吗? - Calvin1602
@Calvin1602 不,我的整个屏幕完全是黑色的,是的,为了当前测试目的,我的p纹理坐标都设置为0。 - TheAmateurProgrammer
2
如果你要使用 GL_LINEAR_MIPMAP_LINEAR,请确保上传一些 mipmaps。 - genpfault
2个回答

2

我已经更改了它,但仍然得到黑屏。这可能是因为glPixelStore不支持GL_TEXTURE_2D_ARRAY吗? - TheAmateurProgrammer
1
而且正如我在问题中所述,我正在使用OpenGL 3.2,因此不支持纹理存储。 - TheAmateurProgrammer
@theAmateurProgrammer 嗯? glPixelStore 对任何 GL_TEXTURE_2D_ARRAY 都一无所知,因此甚至没有“支持”的概念。当然,您必须正确设置它以将像素数据上传到 GPU,这一点您已经做到了(尽管使用 RGBA 数据,4 的对齐方式也可以工作)。等等,您的图像数据确实包含每个像素的 4 个无符号字节,对吧? - Christian Rau
1
@ChristianRau 我的图像数据每个像素应该有4个无符号字节。就如我所说的,在使用相同的纹理参数和像素存储的情况下,我能够单独使用GL_TEXTURE_2D纹理。 - TheAmateurProgrammer
@theAmateurProgrammer:“我正在使用OpenGL 3.2,所以不支持纹理存储。” 这是无稽之谈。ARB_texture_storage是一个(核心)扩展。除非你在MacOSX或某些英特尔卡上工作,否则你很有可能可以访问它。 - Nicol Bolas
2
@NicolBolas 如果你没有注意到,我的代码是用Objective-C编写的,这是在Mac OSX上使用OpenGL的一个很大的指示。下次我发另一个问题时会注明的。 - TheAmateurProgrammer

0

对于 2D 数组纹理,纹理坐标的 'v' 组件变化范围为0-height,'w' 组件变化范围为 0-depth(因为它表示层数)。尝试更改这些纹理坐标。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接