Могу ли я избежать использования 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);

person Adam Lee    schedule 29.03.2014    source источник
comment
Почему вы вообще хотите избегать offsetof?   -  person derhass    schedule 29.03.2014
comment
Это чисто функция C, и я думаю, что в C++ должно быть что-то получше.   -  person Adam Lee    schedule 29.03.2014
comment
это не имеет смысла. offsetof указан в спецификации C++ и, следовательно, является такой же функцией C++, как и все остальное.   -  person derhass    schedule 29.03.2014
comment
Это просто макрос, и я хотел бы увидеть решение с оно-макро. Кто-то сказал, что offsetof можно полностью обойти, я хочу посмотреть, можно ли это сделать в этом конкретном примере.   -  person Adam Lee    schedule 29.03.2014
comment
Это стандартный макрос. Так что наверняка можно обойти. Вы можете сделать то же самое, что и макрос. Обычно это связано с уродливым типизированием указателей NULL, хотя современные компиляторы в любом случае обычно предоставляют для этого встроенные функции. Здесь нечего выигрывать.   -  person derhass    schedule 29.03.2014
comment
ОП был обескуражен сообщениями здесь: stackoverflow.com/questions/22716560/ и хочет найти другое решение своей проблемы.   -  person Brandon    schedule 29.03.2014
comment
Хорошо, это может объяснить причину вопроса. Однако это как раз тот случай, когда эти детали низкого уровня не должны абстрагироваться, поскольку рассматриваемый API просто определен на этом низком уровне.   -  person derhass    schedule 29.03.2014


Ответы (1)


Вы не можете получить адрес нестатического члена, квалифицированного как Vertex::_color. Вам понадобится экземпляр Vertex, но даже в этом случае возвращаемый адрес будет относиться к адресному пространству программы, а это не то, что вам нужно при использовании VBO.

offsetof (...) используется для поиска адреса элемента в структуре данных. Этот адрес не указывает на фактическую память, это буквально просто смещение от начала структуры (и именно поэтому он использует size_t, а не intptr_t или void *).

Исторически, когда массивы вершин были представлены в OpenGL 1.1, он использовал указатель данных в вызове glVertexPointer (...) для ссылки на клиентскую (программную) память. Тогда адрес, который вы передали, фактически указывал на память в вашей программе. Начиная с Vertex Buffer Objects (GL 1.5), OpenGL изменил назначение параметра указателя в glVertexPointer (...), чтобы он служил указателем на память сервера (GPU). Если у вас есть ненулевая привязка VBO при вызове glVertexPointer (...), то указатель на самом деле является смещением.

Точнее, указатель при использовании VBO относится к связанному хранилищу данных VBO, а первое значение в вашем VBO начинается с адреса 0. Вот почему offsetof (...) имеет смысл в этом контексте, и нет причин избегать его использования.

person Andon M. Coleman    schedule 29.03.2014