我可以为GLES20.glDrawElements函数提供多少个索引?

时间:2015-09-01 07:56:15

标签: java opengl android-studio

我想在android Studio中用opengl绘制一个更复杂的对象。 我有一个网格。所有顶点法线和索引都是正确的。

但是当我来到这个函数GLES20.glDrawElements(mode, count, type, indices)时,我遇到的问题是,当计数例如是1661或更高时,应用程序会中断。但是当count为1381时,它的工作正常(因为我的对象看起来错误)。

我认为可能有两个可能的原因。首先这个数字是高的,并且该方法对它可以绘制的对象数量有限制。(但我还没有找到任何关于它的东西,我不认为1700是如此多的索引!)

另一种可能性是我以某种方式定义了openGl绘制的框架或空格错误。我正在与Vuforia合作并使用Vuforia示例项目。当我输入一个小的计数而opengl实际绘制的东西时,它都在图像目标的一个小区域内。但是因为我使用了这个样本,所以我不知道你在哪里定义类似的东西。

如果有人有想法,我会非常感激!

编辑: 这就是Logcat中发生的事情:

D / libEGL:glDrawElements(GL_TRIANGLES,1661,GL_UNSIGNED_SHORT,(const void *)0x899e56d0);

A / libc:致命信号11(SIGSEGV),代码2,tid 65432中的故障地址0xe34s5654(GLThread 8537)

E / BufferQueueProducer:[unnamed-] dequeueBuffer:超出min未加队列的缓冲区计数(2)(dequeued = 7 undequeued = 1)

而且上次报告重复了几次......

1 个答案:

答案 0 :(得分:0)

除了数据类型的固有限制之外,您可以传递给glDrawElements()的索引数没有定义限制。

ES 2.0支持两种索引类型:

  • GL_UNSIGNED_BYTE,最大值为255。
  • GL_UNSIGNED_SHORT,最大值为65,535。

准确地说:以上是对最大索引值的限制,而不是可以传递给glDrawElements()索引数。因此,如果多次使用索引,则索引的数量实际上可能高于此限制。尽管如此,这通常会限制您通过一次调用可以绘制多少几何。

如果您使用GL_UNSIGNED_SHORT作为索引,那么您一定能够使用几千个索引。

我能想到的唯一合理解释是,如果顶点数据太大,设备会耗尽内存。您可以尝试拨打glGetError(),看看是否收到任何GL_OUT_OF_MEMORY错误。尽管如此,这些错误往往无法可靠地报告。

除此之外,还有两种可能的解释:

  1. 您的代码已损坏。
  2. 设备上的OpenGL实现已损坏。
  3. 如果没有看到代码的关键部分,就不可能分辨出这两者中的哪一个。