2016-10-20 48 views
-1

我想呈現藍色的兩個三角形和紅色的「風車」。爲此,我創建了2個着色器,除了顏色外,它們是相同的。這兩個三角形比「風車」大得多。我面臨的問題是,如果我在着色器之間切換,只會渲染最後一個對象。如果我切換到僅使用1個着色器,則兩個對象都將被繪製,但由於顏色相同,我幾乎看不到「風車」。所以我的問題是如何用兩個着色器繪製兩個對象? (我知道我可以將顏色傳遞給片段着色器,但我不想這樣做)。使用2個着色器渲染兩個重疊的2D對象

渲染循環:

GLint index, index2; 
index = glGetUniformLocation(shaders[LINE], "projectionMatrix"); 
index2 = glGetUniformLocation(shaders[TRIANGLE], "projectionMatrix"); 
glUniformMatrix3fv(index, 1, true, value_ptr(projectionMatrix)); 
glUniformMatrix3fv(index2, 1, true, value_ptr(projectionMatrix)); 
glClear(GL_COLOR_BUFFER_BIT); 

glUseProgram(shaders[TRIANGLE]); 
glBindVertexArray(vaos[TRIANGLE]); 
glDrawArrays(GL_TRIANGLES, 0, tbufindex/sizeof(glm::vec3)); 

glUseProgram(shaders[LINE]); // If I comment out this line both objects will be drawn 
glBindVertexArray(vaos[LINE]); 
glDrawArrays(GL_LINE_STRIP, 0, sizeof(vertices_position)/sizeof(glm::vec3)); 

線/ Triangle.vert:

#version 450 
layout (location = 0) in vec3 vPosition; 
uniform mat3 projectionMatrix; 

void main() 
{ 
    vec3 tmp = projectionMatrix*vPosition; 
    gl_Position = vec4(tmp, 1.0f); 
} 

線/ triangle.frag:

#version 450 
in vec4 gl_FragCoord; 
out vec4 fColor; 

void main() 
{ 
    fColor = vec4(0.0, 0.0, 1.0, 1.0); 
} 

另外請注意,我沒有啓用GL_DEPTH_TEST ,我正在使用2D座標。

編輯的位置:

triangles[2] = { { vec3(-0.90f, -0.90f, 1.0f), vec3(0.85f, -0.90f, 1.0f), vec3(-0.90f, 0.85f, 1.0f) }, 
{ vec3(0.90f, -0.85f, 1.0f), vec3(0.90f, 0.90f, 1.0f), vec3(-0.85f, 0.90f, 1.0f) } }; 

lines[39] = { 
    0.0f, 0.0f, 1.0f, 
    0.5f, 0.0f, 1.0f, 
    0.5f, 0.5f, 1.0f, 
    0.0f, 0.0f, 1.0f, 
    0.0f, 0.5f, 1.0f, 
    -0.5f, 0.5f, 1.0f, 
    0.0f, 0.0f, 1.0f, 
    -0.5f, 0.0f, 1.0f, 
    -0.5f, -0.5f, 1.0f, 
    0.0f, 0.0f, 1.0f, 
    0.0f, -0.5f, 1.0f, 
    0.5f, -0.5f, 1.0f, 
    0.0f, 0.0f, 1.0f 
}; 
+0

如果下來的選民留下評論,說明這個問題出了什麼問題,以便我可以更好地解釋這個問題,我將不勝感激。 – para

+0

那些基元的位置是什麼? – Asesh

+0

添加了位置,第三個座標是1.0,這樣我就可以使用矩陣乘法來轉換三角形/線條。 – para

回答

1

glUniform..()必須綁定程序(source)後調用。所以下面應該工作:

glClear(GL_COLOR_BUFFER_BIT); 

glUseProgram(shaders[TRIANGLE]); 
glUniformMatrix3fv(index2, 1, true, value_ptr(projectionMatrix)); 
glBindVertexArray(vaos[TRIANGLE]); 
glDrawArrays(GL_TRIANGLES, 0, tbufindex/sizeof(glm::vec3)); 

glUseProgram(shaders[LINE]); // If I comment out this line both objects will be drawn 
glUniformMatrix3fv(index, 1, true, value_ptr(projectionMatrix)); 
glBindVertexArray(vaos[LINE]); 
glDrawArrays(GL_LINE_STRIP, 0, sizeof(vertices_position)/sizeof(glm::vec3)); 
相關問題