在OpenGL中设置mat4

w00*_*w00 5 opengl glsl

我一直在阅读一些关于着色器的(基本)教程.到目前为止,他们已经介绍了如何在着色器中设置变量.但这只是关于整数,浮点数或向量.我找不到任何关于如何设置mat4变量的信息.我的着色器需要以下内容:

uniform vec3 CameraPos;
uniform mat4 ModelWorld4x4;
Run Code Online (Sandbox Code Playgroud)

所以相机位置和模型的世界矩阵.我想我有CameraPos,但我怎么设置ModelWorld4x4变量?


这就是我设置vector3的方法

campos = glGetUniformLocation(shader.id(), "CameraPos");
glUniform3f(campos, 0.0f, 0.0f, 3.0f);
Run Code Online (Sandbox Code Playgroud)

这是(方法之一)我试图设置mat4

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

我正在使用Assimp库加载模型,因此目前世界矩阵存储在aiMatrix4x4结构中.

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

// Save in a global variable
g_modelworld4x4 = m;
Run Code Online (Sandbox Code Playgroud)

Sir*_*lot 10

确保在着色器中使用ModelWorld4x4,这样它就不会被简单地编译出来.假设g_modelworld4x4是一个浮点*,这对我有用:

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

您可能需要从函数名称中删除ARB,具体取决于声明函数调用的方式.


Ant*_*eru 5

你不能glUniformMatrix4fv按你写的方式打电话.该功能定义为

void glUniformMatrix4fv(    GLint   location,
GLsizei     count,
GLboolean   transpose,
const GLfloat *     value);
Run Code Online (Sandbox Code Playgroud)

在你的情况下,你必须调用它glUniformMatrix4fv (modelw, 1, GL_FALSE, modelworld)应该工作(假设矩阵存储在主机上的列主要.)否则,传递GL_TRUE转移它即时.