[英]OpenGL 3.2 Why am I getting INVALID_ENUM error for glTexStorage3D?
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);
我的目标是在工作贴图实例化的情况下设置纹理数组,以便可以在一次绘制调用中渲染我的贴图。 我遇到了与此处相同的问题: 具有纹理图集的实例化图纸
但是,我不确定目前是否正确执行此操作,因此将不胜感激。 这些也是我的着色器,以防引起问题:
片段着色器
#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核心配置文件规范; 8.19。 免疫形式的纹理图像; 第272页
TexStorage*
命令指定绑定到每个命令目标参数的纹理对象的属性。.....
错误
如果internalformat是表8.11中列出的未调整大小的基本内部格式之一,则会生成INVALID_ENUM错误。
这意味着它是不允许使用GL_RGBA
为第三放慢参数glTexStorage3D
。
请改用GL_RGBA8
:
glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 50, 50, 1);
您指定了OpenGL 3.2,在此版本中,函数glTexStorage3D
不存在。 使用glTexImage3D
,它与GL_RGBA
一起使用,而不是存储功能所需的大小格式GL_RGBA8
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.