2017-09-02 3 views
0

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.

+0

Comment envisagez-vous de faire des textures 3D dans ES 2.0? – genpfault

+0

@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

+0

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

Répondre

0

La fonction glTexImage3D() crée la texture 3D (ou tableau 2D) entière (). Le paramètre depth est la profondeur de l'image elle-même (c'est-à-dire, le nombre total de plans dans un tableau 2D). Ainsi, lorsque vous chargez le deuxième plan, il remplace le premier plan, et lorsque vous chargez le troisième plan, il remplace le deuxième plan. (Elle dépasse également les limites du tableau, whoops!)

Si vous voulez charger une texture 3D (ou tableau 2D) un plan à la fois, utilisez glTexSubImage3D.

+0

Bon à savoir! Je l'ai changé en 'gl.TexSubImage3D (gl.TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 0, largeur, hauteur, , gl.RGBA, \t \t gl.UNSIGNED_BYTE, gl.Ptr (rgbaN.Pix))' mais maintenant rien ne se montre. D'autres prospects? – Max

+0

@Max: Avez-vous lu attentivement la documentation de 'glTexSubImage3D', y compris la description de ce que chacun des paramètres signifie? –

+0

Oui, je l'ai fait, mais ce n'est pas si clair. Plus précisément, cette partie 'Pour les textures de tableau bidimensionnelles, l'index z fait référence à l'index de découpage. Est-ce que cela signifie que l'index z devrait être le décalage dans le tableau et la profondeur devrait toujours être 1? – Max