Установка mat4 в OpenGL - PullRequest
       8

Установка mat4 в OpenGL

5 голосов
/ 26 января 2012

Я читал несколько (базовых) уроков о шейдерах.Пока что они рассмотрели, как устанавливать переменные в вашем шейдере.Но это было только о целых числах, числах или векторах.Я не могу найти ничего о том, как установить переменную 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;

Ответы [ 2 ]

10 голосов
/ 26 января 2012

Убедитесь, что вы используете ModelWorld4x4 в своем шейдере, чтобы он не просто компилировался.Предполагая, что g_modelworld4x4 является плавающей точкой *, это работает для меня:

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

Возможно, вам придется отбросить ARB из имен функций в зависимости от того, как объявлены вызовы вашей функции.

5 голосов
/ 26 января 2012

Вы не можете назвать glUniformMatrix4fv так, как вы это написали. Функция определяется как

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

В вашем случае вы должны вызывать его с помощью glUniformMatrix4fv (modelw, 1, GL_FALSE, modelworld), который должен работать (при условии, что матрица хранится на главном столбце на хосте.) В противном случае, передайте GL_TRUE, чтобы транспонировать ее на лету.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...