How to use GL_TEXTURE_2D_ARRAY in OpenGL 3.2

So, I tried following the docs , however I cannot get the 2D texture array to work.

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

I can load individual textures with the same texture parameters, but I cannot get it to work with an array of 2D textures. All I get is a black texture. Why is this happening?

+4
source share
2 answers
 glTexParameteri(GL_TEXTURE_2D_ARRAY,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); 

Your texture has virtually no mipmaps. So stop telling OpenGL what it does.

In addition, it always sets the mipmap range parameters ( GL_TEXTURE_BASE_LAYER and GL_TEXTURE_MAX_LAYER ) for your texture. Or better yet, use the texture store to allocate the texture store , and it will do it for you.

+2
source

for a 2d_array "v" texture, the texcords component changes from 0-height and "w" from 0-depth (as it denotes a layer). Try changing these tex coordinates.

0
source

Source: https://habr.com/ru/post/1433596/


All Articles