Я пытаюсь использовать матрицу 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;
// ...
Но все, что я получаю на экране, это мусор.
Вы можете попробовать что-то вроде этого
в вашем шейдере используйте макет
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);
Итак, мой ответ был удален по неизвестным причинам.
Здесь я иду снова, на этот раз я отформатирую это по-другому.
У меня была ТОЧНАЯ та же проблема, что и у вопроса, но все было бы запутано. По крайней мере, это описание.
Что исправило это для меня звонил
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
Снова опустите меня и удалите мой ответ, его содержание совсем не изменилось.
Забани меня с сайта, твоя потеря.
Сначала нужно создать 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
звонки.
Похоже, ваши смещения отключены. Так должно быть
((Vec4*)matrices) + sizeOf(Vec4)*i
вместо
((Vec4*)matrices) + i