Web applications WebGL中的顶点是否有限制?

Web applications WebGL中的顶点是否有限制?,web-applications,webgl,Web Applications,Webgl,Three.js说加载的顶点不能超过65k个。 在我的纯webgl应用程序中,它什么也没说,但当我尝试大对象时,它不会显示整个对象 我想把我的对象分割成更小的缓冲区,但这会让我伤心。有没有更好的解决办法?65k真的是顶点的极限数量吗?据我所知,这通常受到硬件和/或驱动程序软件的限制(硬件使用16位索引或类似的)。也许Three.js只是出于安全考虑,并试图确保您的webgl应用程序在所有卡上都能正常工作。也许最好的方法是将你的模型分解成更小的块,这将确保你的应用程序支持当前使用的大部分GPU

Three.js说加载的顶点不能超过65k个。 在我的纯webgl应用程序中,它什么也没说,但当我尝试大对象时,它不会显示整个对象


我想把我的对象分割成更小的缓冲区,但这会让我伤心。有没有更好的解决办法?65k真的是顶点的极限数量吗?

据我所知,这通常受到硬件和/或驱动程序软件的限制(硬件使用16位索引或类似的)。也许Three.js只是出于安全考虑,并试图确保您的webgl应用程序在所有卡上都能正常工作。也许最好的方法是将你的模型分解成更小的块,这将确保你的应用程序支持当前使用的大部分GPU

  • 使用immediatemode(glBegin…glEnd),可以通过的顶点数量没有限制,但是如果有那么多顶点,速度会很慢
  • 您可以尝试使用glGetIntegerv()和GL\u索引位、GL\u MAX\u元素顶点和GL\u MAX\u元素索引来查询卡/驱动程序支持的索引位、最大顶点和最大索引的数量
  • 如果我没记错的话,顶点数组和VBO(顶点缓冲区对象)都有类似的限制(在同一张卡/驱动程序上),所以在它们之间切换可能没有帮助(对此不是100%确定)

是的,WebGL的顶点索引缓冲区现在限制为16位。这是因为他们的目标是使版本1.0尽可能的跨平台,所以有一种趋势是让东西以最低的公分母为目标——在这种情况下,图形硬件有限的移动平台

一旦1.0推出,最初的匆忙结束,他们很可能会借助扩展来放松这些限制——应用程序将能够询问给定的扩展是否受实现支持,并在实现支持的情况下加以利用——就像在普通的桌面OpenGL中一样。已经有一些扩展可用,但它们只允许具有非常广泛的硬件支持的扩展,因此没有任何东西可以帮助您增加顶点数。然而,一旦他们放宽了跨平台的要求,他们可能会支持类似GL_OES_element_index_uint的扩展,该扩展允许32位顶点索引


您可以阅读。

目前,您可以做的是将大对象划分为若干段,每个段包含65K个元素,并对每个段重新编制索引,以便所有段都具有从0到65K的索引。我已经测试了它,WebGL允许它

现在,您必须训练在线段之间共享的顶点。在这种情况下,最简单的替代方法是复制该顶点,以便不再存在共享顶点。但是还有更多的内存友好型替代方案

我有一个关于这项工作的小演示(大脑模型有大约350K个顶点,分为5个部分)


我希望有帮助;-)

可以使用
drawElements
(将索引数组遍历为顶点数组)或
drawArrays
(直接遍历顶点数组)绘制顶点

使用
drawArrays
时,属性缓冲区中的顶点数似乎没有任何限制。使用
drawArrays
可能不太理想,因为对于典型网格,每次顶点出现在基本体中时,都必须指定每个顶点。另一方面,根据场景的不同,这可能是减少WebGL调用数量的一种简单方法


我之所以提到这一点,是因为在阅读了这个问题及其公认的答案之后,我很长一段时间都假设
DrawArray
中的顶点数也被限制在65K。我意外地发现不是这样,并最终通过将具有常见材质的对象聚合到单顶点阵列中获得了很大的加速(从而绕过了当前似乎给角度实现带来负担的每缓冲区性能开销)。

通常其他答案是正确的,但我想我要补充一点澄清:

WebGL(和OpenGL ES 2.0)唯一接受的索引数据类型是无符号字节和无符号短字符。由于无符号short的范围为0-65535,这意味着如果使用gl.DrawElements(大多数框架都使用),则每次绘制调用只能引用65k个顶点。这几乎可以肯定是three.js限制的来源。请注意,您可以在一次抽签调用中拥有远远超过65k个三角形,只要它们只共享65k个顶点


如果使用非索引几何体(gl.DrawArray),每次调用可以有更多的顶点,但请记住,几乎总是要重复其中的一些顶点。我认为,在大多数情况下,GPU内存使用量的减少将有助于拆分抽签调用。

因为我无法对Giles发表评论,所以我将此评论放在这里:

OES元素索引已添加到“社区批准的WebGL扩展”!! 该扩展已在chrome canary中启用。

我想你说的纯粹是openGl。我担心webgl没有访问getIntegerv的权限来查询GL_索引位、GL_MAX_元素和GL_MAX_元素索引。是的,我一般都在谈论OpenGL,还没有尝试webgl,所以我只假设它与“传统”OpenGL具有相同的功能。如果答案没有用,很抱歉。我认为限制是关于三角形:)与您的球体课程有相同的问题,超过136.000个三角形。。。做数学运算,它也达到了65k顶点。。。结果很好,只有一个半球可见,如果你有许多垂直请修复答案:没有顶点数组长度的限制。限制在16位索引中。你可以有一个包含数十亿个顶点的顶点数组,并使用不同的偏移量绘制它们。非常酷的应用程序!我在一个类似的项目中工作,我对查找表很好奇。你在映射哪些变量?我映射任何变量