OpenGL 3.2为什么我为glTexStorage3D收到INVALID_ENUM错误?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenGL 3.2为什么我为glTexStorage3D收到INVALID_ENUM错误?相关的知识,希望对你有一定的参考价值。

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);

我的目标是使用我的工作图块实例设置一个纹理数组,这样我就可以在一次绘制调用中渲染我的tilemap。我遇到了与此相同的问题: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);
}
答案

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

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

.....

错误

如果internalformat是表8.11中列出的未实现的基本内部格式之一,则会生成INVALID_ENUM错误。

这意味着不允许使用qazxsw poi作为qazxsw poi的第3个参数。

使用GL_RGBA代替:

glTexStorage3D
另一答案

你指定了OpenGL 3.2,在这个版本中,GL_RGBA8函数不存在。使用glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 50, 50, 1); ,它与glTexStorage3D配合使用,而不是存储功能所需的大小格式glTexImage3D

以上是关于OpenGL 3.2为什么我为glTexStorage3D收到INVALID_ENUM错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OpenGL 3.2 中绘制全屏四边形?

OpenGL 3.0 到 3.2

OpenGL 3.2 编程指南?

OpenGL 3.2 设置矩阵的麻烦

如何在 OpenGL 3.2+ 中渲染多个形状和对象?

使用带有 FBO 的 OpenGL 3.2+ 的 Linux 屏幕外渲染