Из-за слабого дизайна мне пришлось переписать ВЕСЬ математическую библиотеку и все, что связано с математикой. Вместо этого я узнал, что могу использовать GLM. Если вы сталкивались с моими предыдущими вопросами, я имел дело со скелетной анимацией, поэтому мне нужно загрузить большое количество mat4s, vec3, vec2s. Вот моя предыдущая структура вершин:
struct Vertex {
Vec3 pos;
Vec3 normal;
Vec2 uv;
Vec4 boneindex;
Vec4 weightbias;
};
К сожалению, я обнаружил, что моя математическая библиотека не была POD, и я попытался загрузить всю структуру, и я уверен, что получил странные результаты. То же самое для моих окончательных костных матриц, определенных как:
Mat4 bones[numBones];
и я также попытался загрузить это сразу.
Мне просто интересно, если я заменю свои Vec3s, Vec2s и Mat4s на glm :: vec3, vec2, mat4 и напрямую загружу всю структуру Vertex (количество вершин раз) и установлю смещение для каждого из данных, используя:
glBindBuffer(GL_ARRAY_BUFFER,everythingVBO);
glVertexAttribPointer(xx,xx,xx,xx, BUFFER_OFFSET(0)) // pos
glVertexAttribPointer(xx,xx,xx,xx, BUFFER_OFFSET(sizeof(glm::vec3)) // norm
..
..
same for matrix
glUniformMatrix4fv(xx, numBones, xx, glm::mat4 value)
.
Будет ли это работать как задумано? Я просто не хочу переписывать все это, и на этот раз я должен убедиться, что это работает, потому что я не хочу снова сталкиваться с очередной неудачей.
Это очень простой и очень сложный вопрос. Поэтому сначала я начну с простого способа.
Если вы хотите построить некоторые struct
из типов GLM загрузите их в буфер и получите к ним доступ через glVertexAttribPointer
вы, вероятно, можете избежать неприятностей с большинством компиляторов C ++ 98/03. Предполагая, что вы получаете смещения правильно. Это не будет «переносимый C ++»; что касается стандарта, то это будет поведение, определяемое реализацией (или неопределенное поведение, если вы попытаетесь использовать offsetof
макрос. Конечно, все, что вы могли бы использовать вместо offsetof
будет не менее четко определено стандартом).
Но в целом это будет работать.
В соответствующем компиляторе C ++ 11 будут рассмотрены типы GLM стандартные типы макетов, и поэтому offsetof
имеет четко определенное поведение. И пока ваш Vertex
структура также стандартная компоновка, offsetof
буду работать.
Однако это не значит, что внутренний Структура любого из этих типов не будет иметь произвольного заполнения. glm::vec3
является не должен быть совместим с макетом float[3]
, чего и ожидал бы OpenGL. Стандарт C ++ не защитит вас.
При этом довольно безопасно предположить, что для большинства компиляторов вы столкнетесь с тем, что типы GLM будут эквивалентны массивам. GLM даже обеспечивает type_ptr
функция, чтобы получить указатель на содержимое одного из его типов в виде массива, ожидая, что компилятор сделает их совместимыми.
Точно так же стандарт C ++ не дает никаких гарантий, что float[16*n]
будет совместим с макетом с массивом glm::mat4[n]
, Но опять же, довольно безопасно предположить, что это будет просто работать.
Других решений пока нет …