Можно ли использовать GLM как простые старые данные в glUniformx ()?

Из-за слабого дизайна мне пришлось переписать ВЕСЬ математическую библиотеку и все, что связано с математикой. Вместо этого я узнал, что могу использовать 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)

.

Будет ли это работать как задумано? Я просто не хочу переписывать все это, и на этот раз я должен убедиться, что это работает, потому что я не хочу снова сталкиваться с очередной неудачей.

5

Решение

Это очень простой и очень сложный вопрос. Поэтому сначала я начну с простого способа.

Если вы хотите построить некоторые 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], Но опять же, довольно безопасно предположить, что это будет просто работать.

6

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

Других решений пока нет …

По вопросам рекламы [email protected]