无法访问存储在TEXTURE_2D_ARRAY

时间:2017-09-02 00:03:54

标签: opengl glsl opengl-es-2.0

我正在尝试将纹理数组加载到我的着色器中。我面临的问题是我只能在数组中绘制最后加载的纹理。奇怪的是,这总是在索引0处。我像这样创建纹理数组(我使用Go绑定,但总体思路很明确):

// 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),我会变黑。什么都没画。我目前的想法是,我没有正确分配制服,但我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

glTexImage3D()函数创建整个 3D(或2D数组)纹理。 depth参数是图像本身的深度(即,2D阵列中的平面总数)。因此,当您加载第二个平面时,它将替换第一个平面,当您加载第三个平面时,它将替换第二个平面。 (它也超出了数组边界,哎呀!)

如果要一次加载一个3D(或2D阵列)纹理,请使用glTexSubImage3D