OpenGL片元着色器中无法传递统一的颜色。

3

我正在使用OpenGL 3.1和QGLfunctions进行编程。我无法将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";

我什么都没有显示出来。


1
如果您对所有四个分量都使用0.5f会怎样?有时候很容易混淆RGBA和BGRA的顺序,从而导致alpha通道为0。 - faffaffaff
1个回答

7
glUniform4fv(m_mycolor, 4, color);

根据glUniform文档中有关计数参数的说明:

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

在您的情况下,计数参数应为1,因为您的color[]数组仍然只表示一个vec4条目。

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

正确的版本:

glUniform4fv(m_mycolor, 1, color);

正如@Bahbar所指出的那样:"GL_INVALID_OPERATION在计数大于1且指定的uniform变量不是数组变量时生成。"所以...检查您的GL错误!


3
@M_global: 我会补充一下:"如果 count 大于1并且所指示的 uniform 变量不是数组变量,则会生成 GL_INVALID_OPERATION。" 所以,请检查您的 GL 错误! - Bahbar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接