我正在使用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";
我没有显示任何内容
答案 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错误!