После еще одного вопроса от меня, вот конкретный пример, где я хочу избежать offsetof
,
Для использования с glVertexAttribPointer
Я должен использовать offsetof
для последнего параметра.
glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex),
(const GLvoid *) offsetof(Vertex, _color));
Вертекс это класс. Есть ли способ, которым я могу избежать использования этого? Я попробовал с указателем на участников, но не повезло.
Невозможно скомпилировать в следующем
glVertexAttribPointer(GLKVertexAttribColor, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex),
(const GLvoid *)&Vertex::_color);
Вы не можете получить адрес нестатического члена, квалифицированного как Vertex::_color
, Вам понадобится экземпляр Vertex
, но даже тогда возвращаемый адрес будет относиться к адресному пространству программы, а это не то, что вы хотите, когда используете VBO.
offsetof (...)
используется, чтобы найти адрес элемента в структуре данных. Этот адрес не указывает на фактическую память, это буквально просто смещение от начала структуры (и именно поэтому он использует size_t
скорее, чем intptr_t
или же void *
).
Исторически, когда вершинные массивы были введены в OpenGL 1.1, он использовал указатель данных в вызове glVertexPointer (...)
ссылаться на клиентскую (программную) память. Тогда адрес, который вы передали, фактически указывал на память в вашей программе. Начиная с объектов Vertex Buffer (GL 1.5), OpenGL переопределил параметр указателя в glVertexPointer (...)
служить указателем на память сервера (GPU). Если у вас есть ненулевой VBO, связанный при вызове glVertexPointer (...)
тогда указатель на самом деле является смещением.
Точнее, указатель при использовании VBO относится к хранилищу данных привязанного VBO, и первый элемент в вашем VBO начинается с адреса 0. Вот почему offsetof (...)
имеет смысл в этом контексте, и нет никаких причин, чтобы избежать его использования.
Других решений пока нет …