【发布时间】:2012-01-03 22:04:50
【问题描述】:
我最近从 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_是什么类型?