我最近从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读取
iOffset_
的64位块,导致数字巨大,但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() );
结果完全相同。
fCount_
和iOffset_
是什么类型? - datenwolf