Я пишу программу OpenGL с использованием математической библиотеки GLM OpenGL. Я хотел бы объединить положения вершин, нормали и координаты текстуры в один класс, как
class Vertex {
public:
glm::vec4 position;
glm::vec4 normal;
glm::vec2 texcoord;
};
а затем использовать массив из них в качестве моего объекта буфера вершин (VBO). Однако при звонке glVertexAttribPointer
чтобы отобразить мои VBO, мне нужно дать ему смещение в этой объединенной структуре Vertex для normal
а также texcoord
члены.
Если бы это были PODы, я мог бы использовать что-то вроде
offsetof(Vertex, position)
но это не работает с типами данных glm (или по крайней мере g ++ 4.4.3 выручает).
Каков рекомендуемый способ получить смещение членов Vertex?
(Я понимаю общую причину, почему я не могу иметь offsetof
для произвольных объектов C ++, но в этом конкретном случае вещи кажутся четко определенными).
(Я понимаю общую причину, по которой у меня не может быть offsetof для произвольных объектов C ++, но в данном конкретном случае вещи кажутся четко определенными)
По стандартам C ++ 98/03 они не очень четко определены. C ++ 11 улучшил это, ослабив требования для рассматриваемого типа «стандартное расположение», которое является гораздо более слабым набором правил (offsetof
в C ++ 11 требуются стандартные типы макетов, а не POD). Я не знаю, соответствуют ли классы GLM правилам стандартного макета или нет.
Конечно, это все не имеет значения, поскольку вы имеете дело с компилятором C ++ 98/03. Нет никакого механизма, который требуется стандартом для работы, чтобы получить смещение члена от типа не POD. Вы должны либо придерживаться стандарта POD для создания вершинных данных, не используя типы GLM, либо просто делать то, что работает для интересующего вас компилятора (ов).
Последний случай на самом деле не так уж и плох, с практической точки зрения. Причина, по которой определение POD было изменено в C ++ 11, заключалась в том, что большинство компиляторов уже следовать новые правила; комитет по стандартизации просто узаконил поведение, которое, как известно, работало в разных компиляторах. Так что вы можете просто сделать это. Вы знаете размер glm::vec4
будет 16 байтов, поэтому вычислите смещение вручную.
Других решений пока нет …