我想在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)
而且上次报告重复了几次......
答案 0 :(得分:0)
除了数据类型的固有限制之外,您可以传递给glDrawElements()
的索引数没有定义限制。
ES 2.0支持两种索引类型:
GL_UNSIGNED_BYTE
,最大值为255。GL_UNSIGNED_SHORT
,最大值为65,535。准确地说:以上是对最大索引值的限制,而不是可以传递给glDrawElements()
的索引数。因此,如果多次使用索引,则索引的数量实际上可能高于此限制。尽管如此,这通常会限制您通过一次调用可以绘制多少几何。
如果您使用GL_UNSIGNED_SHORT
作为索引,那么您一定能够使用几千个索引。
我能想到的唯一合理解释是,如果顶点数据太大,设备会耗尽内存。您可以尝试拨打glGetError()
,看看是否收到任何GL_OUT_OF_MEMORY
错误。尽管如此,这些错误往往无法可靠地报告。
除此之外,还有两种可能的解释:
如果没有看到代码的关键部分,就不可能分辨出这两者中的哪一个。