OpenGL纹理数组初始化

时间:2013-06-09 09:33:01

标签: opengl

我想使用纹理数组来降低高纹理绑定成本,但我无法将数据上传到纹理数组。我使用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函数表示存在无效的枚举。

2 个答案:

答案 0 :(得分:3)

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

Gl.glEnable(Gl.GL_TEXTURE_2D_ARRAY_EXT);

呼叫。

这是不允许的。数组纹理不能与固定功能管道一起使用,但仅适用于着色器(根本不需要这些纹理)。 GL_EXT_texture_array spec使这一点非常明确:

  

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

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

答案 1 :(得分:0)

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

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