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