2013-06-19 203 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

相關問題