Я недавно мигрировал из 32-битной среды в 64-битную, и она плавно отошла от одной проблемы: glMultiDrawElements
использует некоторые массивы, которые не работают без некоторой настройки под 64-битной ОС.
glMultiDrawElements( GL_LINE_LOOP, fCount_, GL_UNSIGNED_INT,
reinterpret_cast< const GLvoid** >( iOffset_ ),
mesh().faces().size() );
Я использую VBO как для вершин, так и для индексов вершин. fCount_
и iOffset_
являются массивами GLsizei
. Поскольку буфер связан с GL_ELEMENT_ARRAY_BUFFER
, элементы iOffset_
используются как байтовые смещения от начала VBO. Это прекрасно работает под 32-битной ОС.
Если изменить glMultiDrawElements
на glDrawElements
и поместить его в цикл, он отлично работает на обеих платформах:
int offset = 0;
for ( Sy_meshData::Faces::ConstIterator i = mesh().faces().constBegin();
i != mesh().faces().constEnd(); ++i ) {
glDrawElements( GL_LINE_LOOP, i->vertexIndices.size(), GL_UNSIGNED_INT,
reinterpret_cast< const GLvoid* >( sizeof( GLsizei ) * offset ) );
offset += i->vertexIndices.size();
}
Я думаю, что я вижу, что OpenGL читает 64-битные куски iOffset_
, приводящие к большим числам, но glMultiDrawElements
не поддерживает ни один тип шире, чем 32-битный (GL_UNSIGNED_INT
), поэтому я не уверен, как исправить это.
Кто-нибудь еще имел эту ситуацию и решил ее? Или я справляюсь с этим совершенно неправильно и мне просто повезло на 32-битной ОС?
Обновление
Замена моего существующего кода на:
typedef void ( *testPtr )( GLenum mode, const GLsizei* count, GLenum type,
const GLuint* indices, GLsizei primcount );
testPtr ptr = (testPtr)glMultiDrawElements;
ptr( GL_LINE_LOOP, fCount_, GL_UNSIGNED_INT, iOffset_, mesh().faces().size() );
Результат точно такой же.