- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我真的很难为这个问题想出一个好的标题,所以如果你能想出一个好的标题,请提出一个新标题。或许我们可以在解决我的问题后这样做......现在开始:
我目前正在移植代码以使用 glMultiDrawElements 而不是多次调用 glDrawElements。为此,我使用了我称之为 sequenceList 的东西,它只是一对 std::pair 的两个 vector ,一个 unsigned int 和一个 int。
// Sequence of vectors defining < StartIndex per primitive, Number of vertices per primitive >
using SequenceList = std::pair< std::vector< unsigned int >, std::vector< GLsizei > >;
为了能够对所有变体只使用一个绘制函数(尽管只有一个基元可以使用一个索引列表进行绘制)我已经将函数调用概括为总是使用一个 sequenceList 对象, 但只有一个索引值。这意味着我对所有索引绘制调用使用 glMultiDrawElements(对非索引绘制调用使用 glMultiDrawArrays)。
void GLVBOProbe::draw( unsigned startIndex, int numberOfIndicesToDraw ) const
{
VertexArray::SequenceList sequences = { { startIndex }, { numberOfIndicesToDraw } ) };
GLVBOLib::the().draw( name_, sequences );
}
绘制调用然后绑定(bind)数组/法线/纹理和索引(如果需要)缓冲区。对 glMultiDrawElements 的调用看起来像
glMultiDrawElements( info.mode, sequences.second.data(), GL_UNSIGNED_INT, (const GLvoid **)sequences.first.data(), (GLsizei)sequences.second.size() );
在我的测试用例中,我渲染了 75000 个从 0 开始的索引。所以 sequences.second 包含 75000 个值,而 sequences.first 只包含一个值:0。
现在问题来了:这会导致
崩溃First-chance exception at 0x000000004735E56B in Application.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
我尝试了很多不同的方法来寻找问题,最终找到了一个不会崩溃的变体,这个变体让我很困惑。
如果我将 vector 复制到一个新的局部变量,它就可以工作。由于 vector 的大小为 1,因此仅仅这样做不是问题,但是对于 3000 个索引偏移量,每帧都这样做感觉没那么有趣。
// Non crashing version
std::vector< unsigned int > indicesOffset = sequences.first;
// using sequence and indices
glMultiDrawElements( info.mode, sequences.second.data(), GL_UNSIGNED_INT, (const GLvoid **)indicesOffset.data(), (GLsizei)sequences.second.size() );
我的一个同事说这可能与 vector 的内存对齐有关,说我必须使用 boost 的 boost::aligned_allocator 才能让它工作。
最佳答案
sizeof(GLvoid*)
不保证等于 sizeof(unsigned int)
。但是,您可以将 unsigned int
替换为 GLintptr
,保证与指针的大小相同。
关于c++ - OpenGL glMultiDrawElements 在索引偏移 vector 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27442316/
背景故事:我正在尝试使用单个绘制调用在屏幕上绘制尽可能多的正方形。我正在使用专门用于 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) ? 最佳答案 您需要先将索
我是一名优秀的程序员,十分优秀!