在片段着色器opengl中无法传递均匀的颜色

时间:2013-06-19 23:02:38

标签: opengl fragment-shader

我正在使用openGL 3.1并使用QGL函数进行编程。我无法将统一的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";

我没有显示任何内容

1 个答案:

答案 0 :(得分:7)

glUniform4fv(m_mycolor, 4, color);

关于count参数的glUniform文档:

  

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

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

您正在尝试填充uniform vec4 color[4]数组。

正确的版本:

glUniform4fv(m_mycolor, 1, color);

正如@Bahbar还指出的那样:如果count大于1并且指示的统一变量不是数组变量,则会生成GL_INVALID_OPERATION。“那么..检查你的GL错误!