c++ - 在 64 位操作系统中使用 glMultiDrawElements

标签 c++ opengl 64-bit vbo

我最近从 32 位环境迁移到 64 位环境,除了一个问题外一切顺利:glMultiDrawElements 使用一些数组,如果不在 64 位操作系统下进行一些调整,这些数组将无法工作。

glMultiDrawElements( GL_LINE_LOOP, fCount_, GL_UNSIGNED_INT,
                     reinterpret_cast< const GLvoid** >( iOffset_ ),
                     mesh().faces().size() );

我正在为顶点和顶点索引使用 VBO。 fCount_iOffset_GLsizei 的数组。由于缓冲区绑定(bind)到 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 位 block 的 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() );

结果完全相同。

最佳答案

原因很简单,glMultiDrawElements不期望整数偏移量数组(在您的平台上为 32 位),而是指针数组(在您的平台上为 64 位),被解释为缓冲区偏移量。

但是您只是将整数数组(或指针)转换为指针数组(或指针),这是行不通的,因为该函数现在只是将您的 n 个连续的 32 位值重新解释为 n 个连续的 64 位值.当然,它适用于 glDrawElements,因为您只是将单个整数转换为单个指针,这实际上是将 32 位值转换为 64 位值。

您需要做的不是转换您的指针/数组,而是转换此偏移数组中的每个单独值:

std::vector<void*> pointers(mesh().faces().size());
for(size_t i=0; i<pointers.size(); ++i)
    pointers[i] = static_cast<void*>(iOffset_[i]);
glMultiDrawElements( GL_LINE_LOOP, fCount_, GL_UNSIGNED_INT, 
                     &pointers.front(), mesh().faces().size() );

或者更好的是,从一开始就将偏移量存储为指针而不是整数。

关于c++ - 在 64 位操作系统中使用 glMultiDrawElements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8719287/

相关文章:

c++ - 我可以模板化用户定义的文字吗?

c++ - 物体 Material 错误

c++ - QML 项未呈现

c - OpenGL 异常抛出 : read access violation, 窗口为 0xCCCCCCCC

c - 从 i386 移动到 x86_64 时的浮点精度

python - Pygame 可以在 64 位 Python 2.7 上运行吗?

c++ - #ifdef 用于 32 位平台

c++ - 为什么同一个对象的析构函数被调用了两次?

c++ - OpenCV 树莓派 printf() 不显示

c++ - IsWindows10OrGreater() 在 Windows 10 上失败