4 votes

Comment utiliser GL_TEXTURE_2D_ARRAY dans OpenGL 3.2

J'ai donc essayé de suivre le documents Cependant, je n'arrive pas à faire fonctionner un tableau 2D de textures.

-(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;
}

Je peux charger des textures individuelles avec les mêmes paramètres de texture, mais je n'arrive pas à faire fonctionner le tableau 2D des textures. Tout ce que j'obtiens est une texture noire. Pourquoi cela se produit-il ?

2voto

Nicol Bolas Points 133791
glTexParameteri(GL_TEXTURE_2D_ARRAY,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);

En effet, votre texture no ont des mipmaps. Cessez donc de dire à OpenGL que c'est le cas.

En outre, toujours fixer le paramètres de la gamme mipmap ( GL_TEXTURE_BASE_LAYER y GL_TEXTURE_MAX_LAYER ) pour votre texture. Ou mieux encore, utilisez le stockage de la texture pour allouer le stockage de votre texture et il le fera pour vous.

0voto

debonair Points 919

Pour les textures 2d_array, la composante 'v' des points tex varie de 0-hauteur et la composante 'w' de 0-profondeur (comme pour les couches). Essayez de modifier ces coordonnées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X