Могу ли я избежать использования offsetof в следующем?

После еще одного вопроса от меня, вот конкретный пример, где я хочу избежать 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);

0

Решение

Вы не можете получить адрес нестатического члена, квалифицированного как 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 (...) имеет смысл в этом контексте, и нет никаких причин, чтобы избежать его использования.

1

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

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

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