是什么导致 glTexSubImage1D() - 加载纹理时在此示例中出现GL_INVALID_VALUE错误?

What causes glTexSubImage1D() - GL_INVALID_VALUE error in this example when loading a texture?

本文关键字:GL 错误 VALUE INVALID glTexSubImage1D 纹理 加载 是什么      更新时间:2023-10-16

我正在尝试将传递函数加载为 1D 纹理,如下所示:

glBindTexture(GL_TEXTURE_1D, transfer);
glTexStorage1D(GL_TEXTURE_1D, 1, GL_RGBA32F, 11);
glTexSubImage1D(GL_TEXTURE_1D, 1, 0, 11, GL_RGBA, GL_FLOAT, props.transColors);

其中props.transColors是一个浮点数组(这些值可以在运行时从 GUI 更改(:

float transColors[4 * 11] = 
{
1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f
};

计划是使用glTexSubImage1D()每帧将数组加载为1D纹理。

函数glTexSubImage1D()将始终引发GL_INVALID_VALUE错误。从文档中可以看出,错误可能是由于以下原因之一引起的:

如果级别小于 0,则生成GL_INVALID_VALUE。

如果电平大于 log2 max,则可能会生成GL_INVALID_VALUE, 其中 max 是返回值 GL_MAX_TEXTURE_SIZE。

如果 xoffset<−b,或者如果GL_INVALID_VALUE (xoffset+width(>(w−b(,其中 w 是GL_TEXTURE_WIDTH,b 是 正在修改的纹理图像的GL_TEXTURE_BORDER宽度。 请注意,w 包含边框宽度的两倍。

如果宽度小于 0,则生成GL_INVALID_VALUE。

我认为列出的任何几点都不适用于我的情况。所以我想知道,是什么导致了这个问题?

第二个参数(在GL_TEXTURE_1D之后(是 mipmap 级别。级别 0 是最大的 mipmap 级别。您的图像分配了一个级别(这是要glTexStorage1D的第二个参数(,但您正在尝试上传第二个级别(因为它们从 0 开始(。将 0 传递到glTexSubImage1d作为级别编号,而不是 1。

即使您的纹理确实有多个 mipmap 级别,您上传的数据对于第二个级别来说也太大了。