J'essaye de charger un tableau de texture dans mon shader. Le problème auquel je suis confronté est que je ne peux que dessiner la dernière texture chargée dans le tableau. Étrangement, ce qui est toujours à l'index 0. je crée le tableau de textures comme si (j'utilise des liaisons Go, mais l'idée générale est claire):Problème d'accès aux textures stockées dans un TEXTURE_2D_ARRAY
// Allocate the array
width := 32
height := 32
var textureArray uint32
gl.GenTextures(1, &textureArray)
gl.BindTexture(gl.TEXTURE_2D_ARRAY_EXT, textureArray)
gl.TexStorage3D(gl.TEXTURE_2D_ARRAY_EXT, 1, gl.RGBA, width, height, layerCount)
gl.TexParameteri(gl.TEXTURE_2D_ARRAY_EXT, gl.TEXTURE_MIN_FILTER, gl.LINEAR)
gl.TexParameteri(gl.TEXTURE_2D_ARRAY_EXT, gl.TEXTURE_MAG_FILTER, gl.LINEAR)
gl.TexParameteri(gl.TEXTURE_2D_ARRAY_EXT, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
gl.TexParameteri(gl.TEXTURE_2D_ARRAY_EXT, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
// Load the textures into the array (assume rgbaN.Pix returns an RGBA image
gl.TexSubImage3D(gl.TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 0, width, height, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.Ptr(rgba0.Pix))
gl.TexSubImage3D(gl.TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 1, width, height, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.Ptr(rgba1.Pix))
gl.TexSubImage3D(gl.TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 2, width, height, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.Ptr(rgba2.Pix))
Puis, dans ma boucle de tirage que je fais:
gl.BindTexture(gl.TEXTURE_2D_ARRAY_EXT, textureArray)
gl.BindVertexArray(vertexArray)
gl.DrawElements(gl.TRIANGLES, int32(len(indices)), gl.UNSIGNED_INT, nil)
Mon Shader ressemble à ceci:
#version 110
#if GL_EXT_texture_array
#extension GL_EXT_texture_array : enable
#endif
varying vec2 texCoord;
uniform sampler2DArray texArray;
void main()
{
gl_FragColor = texture2DArray(texArray, vec3(texCoord, 0.0));
}
Avec ce shader, je dessine toujours la dernière texture ajoutée au tableau. Si je change le vec3(texCoord, 0.0)
à quelque chose comme vec3(texCoord, 1.0)
je deviens noir. Rien n'est dessiné. Ma pensée actuelle est que je n'attribue pas l'uniforme correctement, mais je ne sais pas comment réparer cela.
Comment envisagez-vous de faire des textures 3D dans ES 2.0? – genpfault
@genpfault Je pense que l'extension 'GL_EXT_texture_array' permet de stocker des textures 2D dans un tableau de textures. Ou est-ce que je me trompe? – Max
Ne pas voir 'GL_EXT_texture_array' sur la [liste des extensions de registre ES] (https://www.khronos.org/registry/OpenGL/index_es.php). – genpfault