У меня есть следующая структура для хранения моих данных вершин.
struct Rz3DContourNode {
float x; //pos x
float y; //pos y
float z; //pos z
float nx; //normal x
float ny; //normal y
float nz; //normal z
};
Я храню список вершин в векторе STL следующим образом:
std::vector < Rz3DContourNode > nodes;
Когда я пытаюсь использовать это как массив вершин в OPEGL, in не отображает неправильно.
glVertexPointer(3, GL_FLOAT, 12, &nodes[0]);
glDrawArrays(GL_POINTS,0,nodes.size());
Итак, я попытался подтвердить значения с помощью арифметики с указателями (предполагая, что OPENGL обрабатывает данные) следующим образом:
float *ptr=(float*) &nodes[0];
for(int i=0;i<nodes.size();i++)
{
Rz3DContourNode confirmNode=nodes[i];
float x=*ptr;
ptr++;
float y=*ptr;
ptr++;
float z=*ptr;
ptr++;
//Confirm values !!! Do not equal ??
qDebug("x=%4.2f y=%4.2f z=%4.2f | nx=%4.2f ny=%4.2f nz=%4.2f
",confirmNode.x,confirmNode.y,confirmNode.z,x,y,z);
//Skip normal positions
ptr++;
ptr++;
ptr++;
}
Значения не равны, если я получаю прямой доступ к значениям из структуры.
Значит ли это, что struct не сохраняет значения непрерывно?
[РЕДАКТИРОВАТЬ] Я только что заметил, что использование sizeof () вместо 12 решает проблему следующим образом:
glVertexPointer(3, GL_FLOAT, sizeof(Rz3DContourNode), &nodes[0]);
Но все же я запутался, почему мой хак не прошел правильно в памяти? (Почему qDebug не печатает одинаковые значения?)