2012-01-26 7 views
5

私はシェイダーに関するいくつかの(基本的な)チュートリアルを読んできました。これまでは、シェーダーで変数を設定する方法について説明しました。しかし、これはints、浮動小数点またはベクトルについてのみでした。私はmat4変数を設定する方法について何も見つけることができません。私のシェーダは、次のことを期待しています。OpenGLでのmat4の設定

uniform vec3 CameraPos; 
uniform mat4 ModelWorld4x4; 

モデルのカメラ位置とワールドマトリックス。私はCameraPosの権利を持っていると思いますが、どうやってModelWorld4x4変数を設定しますか?


この

は私が私が使用しているMAT4

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

を設定しようとしたかのVector3

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

これは、(のいずれかの方法)を設定する方法でありますAssimpライブラリはモデルを読み込むため、現在の世界の行列はaiMatrix4x4構造体に格納されています。

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

// Save in a global variable 
g_modelworld4x4 = m; 

答えて

10

単純にコンパイルされないように、ModelWorld4x4をシェーダで使用していることを確認してください。 g_modelworld4x4はフロート*であると仮定すると、これは私の作品:

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を渡します飛ぶ。

関連する問題