我一直在阅读有关着色器的一些(基本)教程。到目前为止,他们已经介绍了如何在着色器中设置变量。但这只是关于整数,浮点数或向量。我找不到任何关于如何设置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;
答案 0 :(得分:10)
确保您在着色器中使用ModelWorld4x4,这样它就不会被简单地编译出来。假设g_modelworld4x4是一个浮点*,这对我有用:
int location = glGetUniformLocationARB(program, "ModelWorld4x4");
glUniformMatrix4fvARB(location, 1 /*only setting 1 matrix*/, false /*transpose?*/, g_modelworld4x4;
您可能需要从函数名称中删除ARB,具体取决于函数调用的声明方式。
答案 1 :(得分:5)
您不能按照编写它的方式调用glUniformMatrix4fv
。该函数定义为
void glUniformMatrix4fv( GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat * value);
在您的情况下,您必须使用glUniformMatrix4fv (modelw, 1, GL_FALSE, modelworld)
来调用它(假设矩阵在主机上存储为column-major。)否则,通过GL_TRUE
将其转置为动态