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错误?的主要内容,如果未能解决你的问题,请参考以下文章