【问题标题】:How many indexes can I give the GLES20.glDrawElements function?我可以给 GLES20.glDrawElements 函数多少个索引?
【发布时间】:2015-09-01 07:56:15
【问题描述】:

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

但是当我使用此功能GLES20.glDrawElements(mode, count, type, indices) 时,我遇到的问题是,例如当计数为 1661 或更高时,应用程序会中断。但是当计数为 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 (GLThread 8537) 中的故障地址 0xe34s5654

E/BufferQueueProducer:[unnamed-] dequeueBuffer: min unqueued buffer count (2) exceeded (dequeued=7 unqueued=1)

比上一次报告重复了几次...

【问题讨论】:

  • glDrawElements() 调用期间可以使用的索引范围取决于绘制调用时所有启用的顶点属性数组中的提供的实际数组数据 .对我来说,这似乎只是索引不存在的顶点。
  • @derhass 感谢您的评论!对其进行了测试,但最高索引永远不会高于我的顶点数组/3 -1 的长度。所以每个索引的顶点应该存在。

标签: java opengl android-studio


【解决方案1】:

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

ES 2.0 支持两种索引类型:

  • GL_UNSIGNED_BYTE,最大值为 255。
  • GL_UNSIGNED_SHORT,最大值为 65535。

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

如果您使用GL_UNSIGNED_SHORT 作为索引,您肯定可以使用几千个索引。

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

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

  1. 您的代码已损坏。
  2. 设备上的 OpenGL 实现已损坏。

如果不查看代码的关键部分,就不可能分辨出两者中的哪一个。

【讨论】:

  • 所以我正在使用 GL_UNSIGNED_SHORT 并且我的索引值高于 66(也高于 255)。所以这一定是问题所在。但我现在该怎么办?因为我有一个非常大的对象。其他人是怎么做到的,因为拥有 256 个不同的顶点并没有那么特别。
  • @HHHH 对于GL_UNSIGNED_SHORT,最大值为 65535(参见第二个要点)。我不确定您所在国家/地区的惯例是什么,但在美国(我相信大多数其他英语国家),逗号是“千位分隔符”,而我们使用句点作为小数点。所以 65,535 是 65535(或 2^16 - 1)。
猜你喜欢
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多