无法在片段着色器opengl中传递统一颜色

无法在片段着色器opengl中传递统一颜色,opengl,fragment-shader,Opengl,Fragment Shader,我正在使用OpenGL3.1和QGL3函数编程。我无法将uniform vec4 mycolor传递给已使用以下方法初始化程序的片段着色器: m_program = new QOpenGLShaderProgram(this); m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource); m_program->addShaderFromSourceCode(QOpenGLShader::

我正在使用OpenGL3.1和QGL3函数编程。我无法将uniform vec4 mycolor传递给已使用以下方法初始化程序的片段着色器:

m_program = new QOpenGLShaderProgram(this);
m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource);
m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource);
m_program->link();
m_posAttr = m_program->attributeLocation("posAttr");
m_mycolor = m_program->uniformLocation("mycolor");
m_matrixUniform = m_program->uniformLocation("matrix");
然后我尝试发送颜色

 GLfloat color[] = {
        0.0f, 1.0f, 0.0f, 1.0f    };
glUniform4fv(m_mycolor, 4, color);
到我的片段着色器,它是:

 static const char *fragmentShaderSource =
    "uniform vec4 mycolor;\n"
    "void main() {\n"
    "   gl_FragColor = mycolor;\n"
    "}\n";
我什么也没看到

glUniform4fv(m_mycolor, 4, color);
从有关计数参数的
glUniform
文档中:

指定要修改的图元数。这应该 如果目标统一变量不是数组,则为1,并且为1或更多 如果它是一个数组

案例中的count参数应为1,因为
color[]
数组仍然只表示一个
vec4
条目

您正在尝试填充
统一的vec4颜色[4]
数组

正确版本:

glUniform4fv(m_mycolor, 1, color);

正如@Bahbar还指出的那样:“
GL\u INVALID\u OPERATION
是在计数大于1且指示的统一变量不是数组变量时生成的。”因此。。检查您的总账错误

如果四个组件都使用0.5f会怎么样?有时很容易混淆RGBA BGRA顺序,最终得到0 alphachannel@M_global:我想补充一句:“如果计数大于1,并且指示的统一变量不是数组变量,则生成GL_INVALID_操作。”因此。。检查您的总账错误!