2017-09-02 47 views
0

我想將紋理數組加載到我的着色器中。我面臨的問題是我只能繪製數組中最後一個加載的紋理。奇怪的是,這個總是在索引爲0創建紋理數組像這樣(我使用轉到綁定,但總的思路是清晰的):無法訪問存儲在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)) 

然後,我畫循環內我做的:

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

我着色器看起來是這樣的:

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

有了這個着色器,我總是得出最後添加紋理數組。如果我將vec3(texCoord, 0.0)更改爲vec3(texCoord, 1.0)之類的東西,我會變黑。沒有畫。我目前的想法是,我沒有正確分配製服,但我不知道如何解決這個問題。

+0

你打算如何在ES 2.0中做3D紋理? – genpfault

+0

@genpfault我認爲'GL_EXT_texture_array'擴展允許在紋理數組中存儲2D紋理。還是我誤會了? – Max

+0

未在[ES註冊擴展名列表](https://www.khronos.org/registry/OpenGL/index_es.php)上看到GL_EXT_texture_array。 – genpfault

回答

0

glTexImage3D()函數創建了3D(或2D陣列)紋理的整個整個紋理。參數depth是圖像本身的深度(即,2D陣列中的平面總數)。所以當你加載第二個平面時,它會取代第一個平面,當你加載第三個平面時,它將取代第二個平面。 (它也超出了數組邊界,哎呀!)

如果要一次加載一個3D平面(或2D陣列)紋理,請使用glTexSubImage3D

+0

很高興知道!我將它改爲'gl.TexSubImage3D(gl.TEXTURE_2D_ARRAY_EXT,0,0,0,0,width,height,,gl.RGBA, \t \t gl.UNSIGNED_BYTE,gl.Ptr(rgbaN.Pix))''但現在沒有出現。任何其他線索? – Max

+0

@Max:您是否仔細閱讀過有關'glTexSubImage3D'的文檔,包括每個參數的含義? –

+0

是的,我做了,但並不清楚。具體來說,這部分'對於二維數組紋理,z索引是指切片索引.'。這是否意味着z-index應該是數組中的偏移量,並且深度應該始終爲1? – Max