0

我想使用纹理数组来降低高昂的纹理绑定成本,但我无法将数据上传到纹理数组。我使用 Tao 框架。这是我的代码:

Gl.glEnable(Gl.GL_TEXTURE_2D_ARRAY_EXT);
Gl.glGenTextures(1, out textureArray);
Gl.glBindTexture(Gl.GL_TEXTURE_2D_ARRAY_EXT, textureArray);

var data = new uint[textureWidth, textureHeight, textureCount];
for (var x = 0; x < textureWidth; x++)
{
    for (var y = 0; y < textureHeight; y++)
    {
        for (var z = 0; z < textureCount; z++)
            data[x, y, z] = GetRGBAColor(1, 1, 1, 1);
    }
}

Gl.glTexImage3D(Gl.GL_TEXTURE_2D_ARRAY_EXT, 0, Gl.GL_RGBA, textureWidth, 
    textureHeight, textureCount, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, data);

Console.WriteLine(Glu.gluErrorString(Gl.glGetError()));

glTexImage3D 函数说有一个无效的枚举。

4

2 回答 2

3

GL_INVALID_ENUM上面代码中最可能的原因是

Gl.glEnable(Gl.GL_TEXTURE_2D_ARRAY_EXT);

称呼。

这根本是不允许的。阵列纹理不能与固定功能管道一起使用,而只能与着色器一起使用(根本不需要那些纹理启用)。GL_EXT_texture_array规范说明了这一点:

此扩展不提供使用具有固定功能片段处理的数组纹理。可以通过提供额外的扩展来添加这种支持,允许应用程序将新的目标枚举(TEXTURE_1D_ARRAY_EXT 和 TEXTURE_2D_ARRAY_EXT)传递给启用和禁用。

从来没有任何进一步的扩展允许阵列纹理用于固定功能处理(AFAIK)......

于 2013-06-09T12:11:59.233 回答
0

将 glTexImage3d 的第二个参数更改为 1。

但是,我不知道为什么,nvidia 的 opengl 驱动程序似乎需要至少 1 级纹理 2d 数组对象。

于 2013-08-14T10:40:34.370 回答