2012-01-26 8 views
5

Ho letto alcuni tutorial (di base) sugli shader. Finora hanno spiegato come impostare le variabili nel tuo shader. Ma questo riguardava solo intarsi, galleggianti o vettori. Non riesco a trovare nulla su come impostare una variabile mat4. Il mio Shader prevede quanto segue:Impostazione di un mat4 in OpenGL

uniform vec3 CameraPos; 
uniform mat4 ModelWorld4x4; 

Quindi la posizione della telecamera e la matrice mondo di un modello. Penso di avere il diritto CameraPos, ma come diavolo posso impostare la variabile ModelWorld4x4 ??


Ecco come ho impostato la vector3

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

Questo è (uno dei metodi) come ho cercato di impostare il Mat4

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

sto usando la libreria Assimp per caricare un modello, quindi attualmente la matrice del mondo è memorizzata nella struttura aiMatrix4x4.

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

// Save in a global variable 
g_modelworld4x4 = m; 

risposta

10

Assicurati di utilizzare ModelWorld4x4 nello shader in modo che non venga semplicemente compilato. Supponendo g_modelworld4x4 è un galleggiante *, questo funziona per me:

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

Potrebbe essere necessario far cadere l'ARB dai nomi delle funzioni a seconda di come le chiamate di funzione sono dichiarati.

5

Non è possibile chiamare glUniformMatrix4fv il modo in cui lo hai scritto. La funzione è definita come

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

Nel tuo caso, è necessario chiamare con glUniformMatrix4fv (modelw, 1, GL_FALSE, modelworld) che dovrebbe funzionare (assumendo che la matrice è memorizzato column-major sull'host.) In caso contrario, passare GL_TRUE di recepirla on-the- volare.