Как использовать матрицу 4×4 в качестве атрибута вершины в GLSL?

Я пытаюсь использовать матрицу 4×4 в качестве атрибута вершины, используя этот код:

Mat4 matrices[numVerts];

int mtxBoneID = glGetAttribLocation(hProgram, "aMtxBone");

glEnableVertexAttribArray(mtxBoneID + 0);
glEnableVertexAttribArray(mtxBoneID + 1);
glEnableVertexAttribArray(mtxBoneID + 2);
glEnableVertexAttribArray(mtxBoneID + 3);
glVertexAttribPointer(mtxBoneID + 0, 4, GL_FLOAT, GL_FALSE, sizeof(Mat4), ((Vec4*)matrices) + 0);
glVertexAttribPointer(mtxBoneID + 1, 4, GL_FLOAT, GL_FALSE, sizeof(Mat4), ((Vec4*)matrices) + 1);
glVertexAttribPointer(mtxBoneID + 2, 4, GL_FLOAT, GL_FALSE, sizeof(Mat4), ((Vec4*)matrices) + 2);
glVertexAttribPointer(mtxBoneID + 3, 4, GL_FLOAT, GL_FALSE, sizeof(Mat4), ((Vec4*)matrices) + 3);

// shader:
// ...
attribute mat4 aMtxBone;
// ...

Но все, что я получаю на экране, это мусор.

2

Решение

Вы можете попробовать что-то вроде этого
в вашем шейдере используйте макет

layout(location=x) in mat4 <name>;

х не будет равен glGetAttribLocation, вы должны поддерживать это самостоятельно. Это равно количеству звонков glVertexAttribPointer,
пример

layout(location=0) in vec4 in_Position;
layout(location=1) in vec4 in_Color;
layout(location=2) in vec4 in_Normal;

glVertexAttribPointer(0, xxxxxxxx);
glVertexAttribPointer(1, xxxxxx);
glVertexAttribPointer(2, xxxxxx);
0

Другие решения

Итак, мой ответ был удален по неизвестным причинам.

Здесь я иду снова, на этот раз я отформатирую это по-другому.

У меня была ТОЧНАЯ та же проблема, что и у вопроса, но все было бы запутано. По крайней мере, это описание.

Что исправило это для меня звонил

glDrawElementsInstancedBaseVertex(GL_TRIANGLES,
d->drawCount,
GL_UNSIGNED_INT,
0,
p_objects.size(),
0);

Чтобы нарисовать мои вещи, только это и не более того.

ТЕМ НЕ МЕНИЕ!

Это НЕ МОЖЕТ быть единственной проблемой, которая у вас есть, если ваши вещи нарисованы неправильно. Весь список вещей, которые НУЖНЫ, чтобы исправить это, огромен. Так что я собираюсь разместить здесь ссылку, на которой есть отличный урок о том, как рисовать много вещей. Кроме того, вы можете получить исходный код и попробовать его самостоятельно.

http://ogldev.atspace.co.uk/www/tutorial33/tutorial33.html

Источники здесь: http://ogldev.atspace.co.uk/ogldev-source.zip

Снова опустите меня и удалите мой ответ, его содержание совсем не изменилось.

Забани меня с сайта, твоя потеря.

0

Сначала нужно создать VBO (glGenBuffers) для вашей матрицы, затем связать ее (glBindBuffer), а затем используйте

glVertexAttribPointer(mtxBoneID + 0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glVertexAttribPointer(mtxBoneID + 1, 4, GL_FLOAT, GL_FALSE, 0, 4);
glVertexAttribPointer(mtxBoneID + 2, 4, GL_FLOAT, GL_FALSE, 0, 8);
glVertexAttribPointer(mtxBoneID + 3, 4, GL_FLOAT, GL_FALSE, 0, 12);

вместо вашего glVertexAttribPointer звонки.

-1

Похоже, ваши смещения отключены. Так должно быть

((Vec4*)matrices) + sizeOf(Vec4)*i

вместо

((Vec4*)matrices) + i
-1
По вопросам рекламы [email protected]