2013-06-19 156 views
2

我正在使用openGL 3.1并使用QGL函数进行编程。我无法通过在统一vec4 mycolor到片段着色器我一直在使用初始化我的程序:无法在片段着色器中传递统一颜色opengl

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订单混合起来,最终得到一个0 alpha通道 – faffaffaff

+0

再次没有... –

回答

6
glUniform4fv(m_mycolor, 4, color); 

glUniform文档有关计数参数:

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

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

正确版本:

glUniform4fv(m_mycolor, 1, color); 

作为@Bahbar还指出:“GL_INVALID_OPERATION如果计数大于1,表示均匀变量不是一个数组变量中产生”。所以..检查你的GL错误!

+0

你救了我的命!谢谢!!! –

+3

@M_global:我想补充一点:“如果 计数大于1,并且指示的 统一变量不是数组变量,则会生成GL_INVALID_OPERATION。”所以..检查你的GL错误! – Bahbar

相关问题