gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:47:54 25 4
gpt4 key购买 nike

我最近从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com