2017-09-02 1 views
0

Ich versuche, ein Textur-Array in meinen Shader zu laden. Das Problem, mit dem ich konfrontiert bin, ist, dass ich nur die letzte geladene Textur im Array zeichnen kann. Merkwürdigerweise wird dies immer bei Index 0. Ich schaffe die Textur-Array wie so (I Go Bindungen bin mit, aber die allgemeine Idee ist klar):Probleme beim Zugriff Texturen in einem TEXTURE_2D_ARRAY gespeichert

// 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)) 

Dann habe ich in meinem Draw Schleife tun:

gl.BindTexture(gl.TEXTURE_2D_ARRAY_EXT, textureArray) 
gl.BindVertexArray(vertexArray) 
gl.DrawElements(gl.TRIANGLES, int32(len(indices)), gl.UNSIGNED_INT, nil) 

Mein Shader sieht wie folgt aus:

#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)); 
} 

Mit diesem Shader zeichne ich immer die zuletzt hinzugefügten Textur auf dem Array. Wenn ich die vec3(texCoord, 0.0) zu etwas wie vec3(texCoord, 1.0) ändere, bekomme ich Schwärze. Nichts ist gezeichnet. Mein derzeitiger Gedanke ist, dass ich die Uniform nicht korrekt ordne, aber ich weiß nicht, wie ich das beheben soll.

+0

Wie planen Sie in ES 2.0 3D-Texturen auf tun? – genpfault

+0

@genpfault Ich denke, dass die Erweiterung 'GL_EXT_texture_array' das Speichern von 2D-Texturen in einem Textur-Array ermöglicht. Oder irre ich mich? – Max

+0

Nicht 'GL_EXT_texture_array' auf der [ES Registrierungserweiterungsliste] sehen (https://www.khronos.org/registry/OpenGL/index_es.php). – genpfault

Antwort

0

Die glTexImage3D() Funktion erstellt die gesamte 3D (oder 2D-Array) Textur. Der depth Parameter ist die Tiefe des Bildes selbst (d. H. Die Gesamtzahl der Ebenen in einem 2D-Array). Wenn Sie also die zweite Ebene laden, ersetzt sie die erste Ebene, und wenn Sie die dritte Ebene laden, ersetzt sie die zweite Ebene. (Es überspringt auch die Array-Grenzen, hoppla!)

Wenn Sie eine 3D- (oder 2D-Array-) Textur eine Ebene nach der anderen laden möchten, verwenden Sie glTexSubImage3D.

+0

Gut zu wissen! Ich änderte es in 'gl.TexSubImage3D (gl.TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 0, Breite, Höhe, , gl.RGBA, \t \t gl.UNSIGNED_BYTE, gl.Ptr (rgbaN.Pix))' aber jetzt nichts taucht auf. Irgendwelche anderen Spuren? – Max

+0

@Max: Haben Sie sorgfältig die Dokumentation zu 'glTexSubImage3D' gelesen, einschließlich der Beschreibung dessen, was die einzelnen Parameter bedeuten? –

+0

Ja, habe ich, aber es ist nicht so klar. Speziell dieser Teil 'Für zweidimensionale Array-Texturen bezieht sich der z-Index auf den Slice-Index.'. Bedeutet dies, dass der Z-Index der Offset in das Array sein sollte und die Tiefe immer 1 sein sollte? – Max

Verwandte Themen