【问题标题】:What causes glTexSubImage1D() - GL_INVALID_VALUE error in this example when loading a texture?加载纹理时,是什么导致此示例中的 glTexSubImage1D() - GL_INVALID_VALUE 错误?
【发布时间】:2019-12-16 12:51:36
【问题描述】:

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

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() 每帧将数组加载为一维纹理。

函数glTexSubImage1D() 总是会抛出 GL_INVALID_VALUE 错误。从文档中可以看出,错误可能是由于以下原因之一:

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

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

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

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

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

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,错误现在消失了。如果我可以问一个额外的问题。我计划在渲染循环中调用glTexSubImage1D() 来更新纹理值(以及glUniform1i(location, 0)glActiveTexture(GL_TEXTURE0)glBindTexture(GL_TEXTURE_1D, transfer))。这是更新数据的正确方法吗?
    • @RolandDeschain 是的。必须为纹理采样器统一设置的值是纹理单元的编号(0 代表GL_TEXTURE0,1 代表GL_TEXTURE1,...)。 uniform 默认初始化为 0,所以不需要显式设置 0。
    猜你喜欢
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多