2012-01-26 69 views
5

我一直在閱讀一些關於着色器的(基本)教程。到目前爲止,他們已經介紹瞭如何在着色器中設置變量。但這只是關於整數,浮點數或矢量。我找不到有關如何設置mat4變量的任何信息。我的着色器預計如下:在OpenGL中設置mat4

uniform vec3 CameraPos; 
uniform mat4 ModelWorld4x4; 

所以攝像頭位置和模型的世界矩陣。我認爲我有CameraPos的權利,但我怎麼設置ModelWorld4x4變量?


我這是怎麼設置的Vector3

campos = glGetUniformLocation(shader.id(), "CameraPos"); 
glUniform3f(campos, 0.0f, 0.0f, 3.0f); 

這是(方法之一),我如何試圖設置MAT4

glGetFloatv(GL_MODELVIEW_MATRIX, modelworld); 
modelw = glGetUniformLocation(shader.id(), "ModelWorld4x4"); 
glUniformMatrix4fv(g_modelworld4x4, modelworld); // Not working 

我使用Assimp庫加載模型,所以當前世界矩陣存儲在aiMatrix4x4結構中。

// world matrix of the model 
aiMatrix4x4 m = nd->mTransformation; 

// Save in a global variable 
g_modelworld4x4 = m; 

回答

10

確保您在着色器中使用了ModelWorld4x4,以便它不會被編譯出來。假設g_modelworld4x4是float *,這個工作對我來說:

int location = glGetUniformLocationARB(program, "ModelWorld4x4"); 
glUniformMatrix4fvARB(location, 1 /*only setting 1 matrix*/, false /*transpose?*/, g_modelworld4x4; 

您可能需要根據您的函數調用如何從聲明函數名掉落ARB。

5

您不能以您寫的方式致電glUniformMatrix4fv。該函數定義爲

void glUniformMatrix4fv( GLint location, 
GLsizei  count, 
GLboolean transpose, 
const GLfloat *  value); 

在你的情況,你必須glUniformMatrix4fv (modelw, 1, GL_FALSE, modelworld)調用它應該工作(假定矩陣存儲列主主機上)。否則,傳遞GL_TRUE移調它-the-飛。