微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

绘制多个对象时,何时创建新的顶点数组对象?

如何解决绘制多个对象时,何时创建新的顶点数组对象?

我正在尝试使用WebGL创建游戏。

我目前有3种纹理,一种带有字体的字母,一个用于角色的精灵表,以及一个用于世界的图块。所以我有一些大的纹理,我需要多次绘制一小部分。

做到这一点的最佳方法是什么?

我目前的方法是对每个字母,地图上的正方形,角色姿势等使用VAO,因此我将拥有150多个VAO。我认为VAO很好,因为它们既简单又快速,但是thisthis和其他公司似乎认为这不是最佳选择。

我知道的另一种方法是只包含三个VAO,并更改WebGL开始在缓冲区中读取的位置,以获取正确字母的位置。因此,我将拥有三个带有大型阵列的VAO,而不是数百个带有微小阵列的VAO。如果这是正确的方法,我每次绘制东西时都必须在gl.enabLevertexAttribArray()之后调用gl.vertexAttribPointer(),还是只修改gl.drawArrays()中的count参数?

gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS)是16或32,因此将纹理切碎也不是一个方法

最好的概念方法是什么?

解决方法

您有多少个VAO。有很多权衡。就文本而言,尽管最常见的方法是将文本字形放入纹理图集中,并为要绘制的所有字母的顶点生成缓冲区。

换句话说。

each frame
   for each string
      for each letter in string
         add vertices for letter to buffer

drawArray/drawElements(gl.TRIANGLES,... totalOfAllLettersInAllStrings * 6);

因此,所有字母(如UI)可能只有一个绘制调用。每个字母没有一个。那将是减慢速度的方法。

Here's an article on it

您对MAX_TEXTURE_IMAGE_UNITS的评论听起来也可能有误会?纹理单位只是着色器在单个绘制调用中可以引用的最大纹理数量。它们不是纹理周期的最大数目。您可以有1000多个纹理。您只能在每次绘图调用时为其指定特定编号。

就绘图文本而言,对于简单情况,通常每个字体样式仅需要一个纹理。 如果您想支持所有的unicode而不是仅仅说ASCII,它可能会很快变得复杂。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。