【问题标题】:OpenGL 3.2 Why am I getting INVALID_ENUM error for glTexStorage3D?OpenGL 3.2 为什么我收到 glTexStorage3D 的 INVALID_ENUM 错误?
【发布时间】:2018-09-24 11:03:29
【问题描述】:
stbi_uc* data = stbi_load(path, &width, &height, NULL, 4);
if (data == NULL) {
    return false;
}
gl_flush_errors();

glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_2D_ARRAY, id);
glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA, 50, 50, 1);

这是我的代码中出现 INVALID_ENUM 错误的部分,我已将其范围缩小到 glTexStorage3D 调用。在这段代码之后,我也遇到了 INVALID_VALUE 错误:

glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, width, height, 1, GL_RGBA, GL_UNSIGNED_BYTE, data);

glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_CLAMP_TO_EDGE);

我的目标是使用我的工作图块实例设置一个纹理数组,以便我可以在一次绘制调用中渲染我的图块地图。我遇到了与这里相同的问题: Instanced drawing with texture atlas

但是,我不确定我目前是否正确执行此操作,因此我们将不胜感激任何帮助或指导。这些也是我的着色器,以防它们是问题的原因:

片段着色器

#version 330
// From vertex shader
in vec2 uvcoord;

// Application data
uniform sampler2DArray textures;
// uniform vec3 fcolor;

// Output color
layout(location = 0) out  vec4 color;

void main()
{

    color = texture(textures, vec3(uvcoord.x, uvcoord.y, 0.0));


}

顶点着色器

#version 330 
// Input attributes
in vec2 in_position;
in vec2 in_uvcoord;
in vec2 in_centre_pos;

// Passed to fragment shader
out vec2 uvcoord;
out vec2 vpos;

// Application data
uniform mat3 transform;
uniform mat3 projection;

void main()
{
    uvcoord = in_uvcoord;
    vpos = in_position;
    vec3 pos = projection * vec3(in_position.x + in_centre_pos.x, in_position.y + in_centre_pos.y, 1.0);
    gl_Position = vec4(pos.x, pos.y, 0.0, 1.0);
}

【问题讨论】:

    标签: c++ opengl rendering


    【解决方案1】:

    OpenGL 4.6 API Core Profile Specification; 8.19. IMMUTABLE-FORMAT TEXTURE IMAGES; page 272:

    TexStorage* 命令指定绑定到每个命令的目标参数的纹理对象的属性。

    .....

    错误

    如果 internalformat 是表 8.11 中列出的 unsized base internal formats 之一,则会生成 INVALID_ENUM 错误。


    这意味着不允许将GL_RGBA 用于glTexStorage3D 的第三个参数。

    改用GL_RGBA8

    glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 50, 50, 1);
    

    【讨论】:

    • 谢谢,修复了枚举错误!我现在的问题是我不确定如何使用 glTexStorage3D 将我的纹理图集拼接到单独的纹理层中。我将调用更改为:glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 672, 736, 1); 所以它与我的纹理图像的宽度和高度相匹配。但是,我的纹理图像由 483 个 32x32 像素图块组成,当我这样做时:glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 32, 32, 483); 我收到一个 INVALID_VALUE 错误。是我设置的参数不正确吗?
    • @danbrodsky 我看不到任何明显的问题。如果宽度、高度、深度或级别小于 1,则会生成 INVALID_VALUE。
    【解决方案2】:

    您指定了 OpenGL 3.2,在此版本中函数 glTexStorage3D 不存在。使用glTexImage3D,它适用于GL_RGBA,而不是存储功能所需的大小格式GL_RGBA8

    【讨论】:

      猜你喜欢
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 2015-01-30
      • 2014-02-10
      • 2015-06-27
      • 2013-07-31
      • 1970-01-01
      相关资源
      最近更新 更多