C ++, структура памяти и OpenGL glVertexPointer? - PullRequest
1 голос
/ 05 сентября 2011

У меня есть следующая структура для хранения моих данных вершин.

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 не печатает одинаковые значения?)

1 Ответ

3 голосов
/ 05 сентября 2011
sizeof(Rz3DContourNode) == 6*4 = 24 bytes ... not 12!

Шаг - это число байтов между началом каждой вершины, а не заполнение. Хотя 0 - это специальное значение, которое указывает на плотно упакованные данные.

Таким образом, если вы используете 3 числа с плавающей точкой в ​​качестве данных вершины, нет никакой разницы между шагом 0 и 12 (потому что 3 числа с плавающей запятой - 12 байтов). В вашем случае ваша структура составляет 24 байта, поэтому вы должны поместить это.

Это соглашение (шаг = размер шага, а не отступ) позволяет просто использовать sizeof, так что вы в конечном итоге сделали правильные вещи интуитивно. Это хороший дизайн API для вас. :)

См. glVertexPointer docs :

* шаг 1014 *

Определяет смещение в байтах между последовательными вершинами. Если шагать равно 0, вершины считаются плотно упакованными в массиве. Начальное значение равно 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...