- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我最近从 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/
背景故事:我正在尝试使用单个绘制调用在屏幕上绘制尽可能多的正方形。我正在使用专门用于 2D 绘图的自定义 glsl 顶点着色器,它应该是从 samplerBuffer 中提取正方形顶点的位置数据。因为
我有一个模型,我想用 glMultiDrawElements 渲染。准备数据并使用简单的 vector 渲染它工作正常,但当我使用顶点缓冲区时失败。显然我在计算缓冲区偏移量时犯了某种错误。首先是工作代
我在很多网站上都读到过 glMultiDrawElements是“相当于”这样做: for(int i = 0; i < drawCount; ++i){ glDrawElements(mod
我最近从 32 位环境迁移到 64 位环境,除了一个问题外一切顺利:glMultiDrawElements 使用一些数组,如果不在 64 位操作系统下进行一些调整,这些数组将无法工作。 glMulti
我使用 OpenGL 和 GLSL 开发了一个小型 3D 引擎。 我已经合并了一个顶点数据批处理系统,其目标是收集所有几何图形(所有对象)共享相同的着色器程序和相同的变换在一个唯一的顶点缓冲区对象(V
我真的很难为这个问题想出一个好的标题,所以如果你能想出一个好的标题,请提出一个新标题。或许我们可以在解决我的问题后这样做......现在开始: 我目前正在移植代码以使用 glMultiDrawElem
ffunction glMultiDrawElements 需要一个指向指针的指针作为其参数之一。如何从 StorableArray Int a 获取 Ptr(Ptr a) ? 最佳答案 您需要先将索
我是一名优秀的程序员,十分优秀!