3

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

我什么也没显示

4

1 回答 1

7
glUniform4fv(m_mycolor, 4, color);

glUniform有关 count 参数的文档中:

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

您的情况下的 count 参数应该是 1,因为您的color[]数组仍然只代表一个vec4条目。

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

正确的版本:

glUniform4fv(m_mycolor, 1, color);

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

于 2013-06-20T04:42:36.490 回答