Opengl 无法访问GLSL中的vec4数组
当我试图在OpenGL4.0中编译这个GLSL代码时,我得到了错误1282 顶点着色器:Opengl 无法访问GLSL中的vec4数组,opengl,graphics,glsl,Opengl,Graphics,Glsl,当我试图在OpenGL4.0中编译这个GLSL代码时,我得到了错误1282 顶点着色器: #version 330 core layout(location = 0) in vec2 aPos; uniform mat4 model[100]; uniform mat4 projection; out int instanceID; void main() { instanceID = gl_InstanceID; gl_Position = projection * mo
#version 330 core
layout(location = 0) in vec2 aPos;
uniform mat4 model[100];
uniform mat4 projection;
out int instanceID;
void main()
{
instanceID = gl_InstanceID;
gl_Position = projection * model[gl_InstanceID] * vec4(aPos.x, aPos.y, 0.0, 1.0);
}
片段着色器:
#version 330 core
in int instanceID;
out vec4 FragColor;
uniform vec4 color[100];
void main()
{
FragColor = color[instanceID];
}
该代码是常规着色器程序创建,因为我在绘制或类似操作之前出现错误,但以防万一,下面是代码:
unsigned int vertex, fragment;
vertex = glCreateShader(GL_VERTEX_SHADER);
std::string vShaderCode = ReadEntireTextFile(vertPath);
const char* c_vShaderCode = vShaderCode.c_str();
glShaderSource(vertex, 1, &c_vShaderCode, NULL);
glCompileShader(vertex);
std::string fShaderCode = ReadEntireTextFile(fragPath);
fragment = glCreateShader(GL_FRAGMENT_SHADER);
const char* c_fShaderCode = fShaderCode.c_str();
glShaderSource(fragment, 1, &c_fShaderCode, NULL);
glCompileShader(fragment);
// shader Program
m_RendererID = glCreateProgram();
glAttachShader(m_RendererID, vertex);
glAttachShader(m_RendererID, fragment);
glLinkProgram(m_RendererID);
// delete the shaders as they're linked into our program now and no longer necessery
glDeleteShader(vertex);
glDeleteShader(fragment);
glUseProgram(m_RendererID);
我确信这个错误是因为instanceID,因为它在着色器没有instanceID的情况下工作。但我试图找到问题的症结所在,但运气不佳
更新:
确保着色器已成功编译。结果证明它们编译成功了
我能够精确地指出错误发生的地方,这是GluseProgramm函数
我认为错误是因为instanceID,因为当我更改时:
FragColor = color[instanceID];
到
这个程序有效
更新(2):
我解决了这个问题。
原来我有两个问题,一个是我有太多的组件,我修复了,感谢其中一个答案提醒我
另一个是我不能直接在片段着色器中放置制服,我认为你可以这样做。因此我将颜色放置在顶点着色器中,并传递片段着色器所需的一种颜色
谢谢你的帮助
这远远超出了规范的保证范围。此处的限制是GL\u MAX\u VERTEX\u UNIFORM\u组件
,规范保证至少为1024个。由于mat4
消耗16个组件,最多64个矩阵。现在,您的特定限制可能更高,但您的程序中还有其他制服,如color[100]
(来自评论):
它不会为片段着色器和顶点着色器以及
glGetShaderiv(着色器、GL\u编译\u状态和输出)返回任何内容代码>为两个着色器返回true
但这并不意味着程序对象链接成功。这种资源限制通常在链接期间强制执行
我很确定这个程序是openGL成功创建的一个对象,但我不确定其他的。您可以看到我是否将片段着色器主函数更改为FragColor=color[0]代码>它会起作用,所以我认为问题在于instanceID
这一结论并不适用。如果您编写color[0]
,它会将vec4r[100]
数组优化为vec4[1]
,您可能会低于特定的限制。哪个gl调用导致了错误?你能发布那段代码吗?那是glUseProgram。你应该检查编译日志,看看编译是否正确。调用glCompileShader()
后,需要调用。它不会为片段和顶点着色器以及glGetShaderiv(着色器、GL\u COMPILE\u状态和输出)返回任何内容;对于两个着色器都返回true。根据,如果“程序不是程序对象”、“程序无法成为当前状态的一部分”或“变换反馈模式处于活动状态”,您将从glUseProgram()
获得GL\u INVALID\u操作。所以这一定是这三件事中的一件。我试着将矩阵和vec4的大小从100改为10,这应该远远低于1024个分量,但我仍然得到相同的错误:(
FragColor = color[0];
uniform mat4 model[100];