【问题标题】:glDrawElements doesn't draw all geometryglDrawElements 不会绘制所有几何图形
【发布时间】:2014-12-01 22:07:30
【问题描述】:

我在尝试在 Vuforia iOS 示例中绘制自定义模型时遇到了麻烦,但这只是 OpengGLES 2.0 代码。它有很多顶点(+100 K),但对于测试,我只是在我的片段着色器中分配自定义颜色,这工作正常,用另一个模型测试。现在我不使用 VBO,直到这个工作。

TESFPositions 它是一个浮点数数组:x,y,z,x,y,z... TESFIndices 它是一个 GLuint 数组。

glUseProgram(shaderProgramID);
glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE, (const GLfloat*)&modelViewProjection.data[0]);
glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, TESFPositions);
glEnableVertexAttribArray(vertexHandle);
//glDrawArrays(GL_TRIANGLES, 0, TESFVertices); <-- Works fine
glDrawElements(GL_TRIANGLE_STRIP, sizeof(TESFIndices) / sizeof(GLuint), GL_UNSIGNED_INT, (GLvoid*)TESFIndices); <-- Some geometry is missing

有什么想法吗?谢谢。

【问题讨论】:

  • 到底是什么问题......?
  • 正如主题所说,它不会绘制所有几何图形。这是一座历史悠久的建筑,使用 glDrawElements 时缺少一些外表面,但使用相同的代码但 glDrawArrays 看起来没问题(注释行)

标签: ios opengl-es-2.0 vuforia


【解决方案1】:

由于索引缓冲区计数容量小而导致溢出是一个常见问题。该索引很可能是一个 16 位无符号整数,这导致最大索引可能刚刚超过 65k(我相信是 65545)。

要解决此问题,请尝试将格式更改为更大的值,但要了解并非所有设备都支持大于 16 位的索引。如果不支持它,您需要将模型分成几个较小的模型。您可以在设计时或加载时执行此操作。

【讨论】:

  • 根据我所拥有的read,无符号整数是 32 位值,无符号短整数是 16。这就是我使用 gluint 作为索引的原因。
  • 我明白了,但仍有理由怀疑这正是问题所在。这种溢出也可能发生在导入器中,可以通过在绘制调用之前打印最大的索引值来检查,或者可以在内部发生(您的 GLuint 被忽略)...
猜你喜欢
  • 2014-08-04
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多