Opengl 无法访问GLSL中的vec4数组

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

当我试图在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 * 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];