2017-09-16 124 views
-1

我有兩個具有自己的模型座標,顏色等的類。我也有兩個邏輯上相同的着色器程序。首先我執行一個着色器程序,用傳統的視圖和投影矩陣編輯制服,然後我調用該類來獨特地編輯模型矩陣,然後繪製它的基元。緊接着,我做了完全相同的事情,但是使用第二個着色器程序,再次編輯制服,並調用第二個類來繪製它的基元,並且它是它自己獨特的模型矩陣座標。 在第二堂課中,我翻譯每次迭代的模型矩陣,但不是在第一課。由於某種原因,它也翻譯了第一堂課的模型矩陣,我不知道爲什麼?爲什麼我的程序會翻譯我所有的頂點?

源代碼:

//First shader program, update view and proj matrix, and have first class draw it's vertices 
executable.Execute(); 
GLuint viewMatrix = glGetUniformLocation(executable.getComp(), "viewMatrix"); 
glUniformMatrix4fv(viewMatrix, 1, GL_FALSE, glm::value_ptr(freeView.getFreeView())); 
GLuint projMatrix = glGetUniformLocation(executable.getComp(), "projectionMatrix"); 
glUniformMatrix4fv(projMatrix, 1, GL_FALSE, glm::value_ptr(projectionMatrix.getProjectionMatrix())); 
temp.useClass(executable); 

//Second Shader program, update view and proj matrix, and have second class draw it's vertices 
executable2.Execute(); 
viewMatrix = glGetUniformLocation(executable2.getComp(), "viewMatrix"); 
glUniformMatrix4fv(viewMatrix, 1, GL_FALSE, glm::value_ptr(freeView.getFreeView())); 
projMatrix = glGetUniformLocation(executable2.getComp(), "projectionMatrix"); 
glUniformMatrix4fv(projMatrix, 1, GL_FALSE, glm::value_ptr(projectionMatrix.getProjectionMatrix())); 
temp2.useClass(executable2); 

VertexShader:

#version 330 core 

layout(location = 0) in vec3 positions; 
layout(location = 1) in vec3 colors; 

uniform mat4 modelMatrix; 
uniform mat4 viewMatrix; 
uniform mat4 projectionMatrix; 

out vec3 color; 

void main() 
{ 
    gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(positions, 1.0f); 
    color = colors; 
} 

第二頂點着色器在邏輯上是相同的,只有不同的變量名,和片段着色器只是輸出顏色。

useClass功能(從一個類):

glBindVertexArray(tempVAO); 
glm::mat4 modelMat; 
modelMat = glm::mat4(); 
GLuint modelMatrix = glGetUniformLocation(exe.getComp(), "modelMatrix"); 
glUniformMatrix4fv(modelMatrix, 1, GL_FALSE, glm::value_ptr(modelMat)); 
glDrawArrays(GL_TRIANGLES, 0, 3); 
glBindVertexArray(0); 

useClass功能(從兩個類):

glBindVertexArray(tempVAO); 
for(GLuint i = 0; i < 9; i++) 
{ 
    model[i] = glm::translate(model[i], gravity); 
    GLuint modelMatrix = glGetUniformLocation(exe.getComp(), "modelMatrix"); 
    glUniformMatrix4fv(modelMatrix, 1, GL_FALSE, glm::value_ptr(model[i])); 
    glDrawArrays(GL_POINTS, 0, 1); 
} 
glBindVertexArray(0); 

兩個類都有數據保護,我只是不明白怎麼翻譯在使用兩個着色器程序時,一個類中的模型矩陣是否會使另一個類中的模型矩陣也被翻譯?當我爲這兩個類使用一個着色器程序時,翻譯工作正常,但沒有太多當我使用兩個着色器程序(每個類一個)...

編輯:在我的項目上工作多一點後,我發現當我編譯並鏈接兩個具有相同確切頂點和片段着色器的不同着色器程序時,會發生同樣的問題,並且在我從每個類中繪製之前使用每個着色器程序。所以現在我的問題更多的是:爲什麼在繪製之間使用兩個相同的着色器程序會導致所有的頂點/模型矩陣被翻譯?

+0

我沒有看到任何錯誤。也許在你不顯示的代碼中...你確定使用不同的着色器嗎?你是否使用'glUseProgram'來爲每個班加上正確的ID? – Ripi2

+0

是的,我將每個着色器程序實例的引用傳遞給它的唯一類,並從它們的類中編輯模型矩陣,然後繪製原語。當我使用其中一個着色器程序時,它工作得很好,當我使用相同的着色器程序兩次時,事情運行良好,但是當我使用兩個不同的着色器程序(即使它們在邏輯上相同)時,所有內容都會被翻譯。 .. – Flare

+1

你在哪裏'glUseProgram'?統一的位置可以在任何時候通過'glGetUniformLocation'獲取,並且在程序鏈接成功後('glLinkProgram')存儲起來供以後使用,但是爲了設置統一變量的值,程序必須是活動程序。這意味着'glUseProgram'必須在'glUniformMatrix4fv'之前完成。 – Rabbid76

回答

0

我想出了問題所在。基本上,由於沒有真正的方法可以直接退出着色器的執行,當我將着色器通過函數傳遞到程序的其他部分時,我的程序變得困惑。出於某種原因,該程序認爲兩個着色器程序正在同時執行,因此爲什麼模型矩陣不能一致地重置。爲了解決這個問題,我限制了每個着色器的範圍。我沒有在同一個函數中執行着色器,而是將其傳遞給其他類,所以我將每個着色器放入它所用的相應類中。

相關問題