glCopyImageSubData 给我 GL_INVALID_VALUE
glCopyImageSubData gives me GL_INVALID_VALUE
我做了一个最小的代码示例,它重现了我游戏中的一个错误。
我正在尝试将 TEXTURE_1D_ARRAY 的区域复制到另一个区域。
u32 tex0;
glGenTextures(1, &tex0);
glBindTexture(GL_TEXTURE_1D_ARRAY, tex0);
glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA8, 64, 2, 0, GL_RGBA, GL_FLOAT, initTexData);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
u32 tex1;
glGenTextures(1, &tex1);
glBindTexture(GL_TEXTURE_1D_ARRAY, tex1);
glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA8, 64, 3, 0, GL_RGBA, GL_FLOAT, nullptr);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glCopyImageSubData(
tex0, GL_TEXTURE_1D_ARRAY,
0, 0, 0, 0,
tex1, GL_TEXTURE_1D_ARRAY,
0, 0, 0, 0,
64, 2, 1
);
纹理 tex0
使用一些像素数据进行了初始化,尺寸为 64x2。
然后我创建尺寸为 64x3 且数据为空的 tex1
。
最后我把tex0
的内容复制到tex1
,但是操作失败
它给出了错误GL_INVALID_VALUE
。根据 documentation 的说法,该错误有几个不同的原因。但我已经用 ApiTrace 调试了它,它提供了一些有用的信息:
major api error 1281: GL_INVALID_VALUE error generated. The y values exceeds the boundaries of the corresponding image object.
glGetError(glCopyImageSubData) = GL_INVALID_VALUE
错误消息表明我越界了,但我不知道怎么办。我正在复制一个 64x2 的区域,它应该适合两个纹理。一定有什么愚蠢的错误我自己看不出来。
如果您想查看完整代码:https://gist.github.com/tuket/2198c17107c513c667d7381bbb34386d
您收到 INVALID_VALUE 错误,因为 srcHeight 参数 glCopyImageSubData
超出了相应的图像对象。
一维纹理的高度始终为1。但是一维纹理数组的深度可以大于1:
glCopyImageSubData(
tex0, GL_TEXTURE_1D_ARRAY,
0, 0, 0, 0,
tex1, GL_TEXTURE_1D_ARRAY,
0, 0, 0, 0,
64, 1, 2 // height = 1, but depth = 2
);
不要让 glTexImage2D
混淆您在哪里使用高度参数指定一维纹理数组的层。
我做了一个最小的代码示例,它重现了我游戏中的一个错误。
我正在尝试将 TEXTURE_1D_ARRAY 的区域复制到另一个区域。
u32 tex0;
glGenTextures(1, &tex0);
glBindTexture(GL_TEXTURE_1D_ARRAY, tex0);
glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA8, 64, 2, 0, GL_RGBA, GL_FLOAT, initTexData);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
u32 tex1;
glGenTextures(1, &tex1);
glBindTexture(GL_TEXTURE_1D_ARRAY, tex1);
glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA8, 64, 3, 0, GL_RGBA, GL_FLOAT, nullptr);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glCopyImageSubData(
tex0, GL_TEXTURE_1D_ARRAY,
0, 0, 0, 0,
tex1, GL_TEXTURE_1D_ARRAY,
0, 0, 0, 0,
64, 2, 1
);
纹理 tex0
使用一些像素数据进行了初始化,尺寸为 64x2。
然后我创建尺寸为 64x3 且数据为空的 tex1
。
最后我把tex0
的内容复制到tex1
,但是操作失败
它给出了错误GL_INVALID_VALUE
。根据 documentation 的说法,该错误有几个不同的原因。但我已经用 ApiTrace 调试了它,它提供了一些有用的信息:
major api error 1281: GL_INVALID_VALUE error generated. The y values exceeds the boundaries of the corresponding image object.
glGetError(glCopyImageSubData) = GL_INVALID_VALUE
错误消息表明我越界了,但我不知道怎么办。我正在复制一个 64x2 的区域,它应该适合两个纹理。一定有什么愚蠢的错误我自己看不出来。
如果您想查看完整代码:https://gist.github.com/tuket/2198c17107c513c667d7381bbb34386d
您收到 INVALID_VALUE 错误,因为 srcHeight 参数 glCopyImageSubData
超出了相应的图像对象。
一维纹理的高度始终为1。但是一维纹理数组的深度可以大于1:
glCopyImageSubData(
tex0, GL_TEXTURE_1D_ARRAY,
0, 0, 0, 0,
tex1, GL_TEXTURE_1D_ARRAY,
0, 0, 0, 0,
64, 1, 2 // height = 1, but depth = 2
);
不要让 glTexImage2D
混淆您在哪里使用高度参数指定一维纹理数组的层。