【问题标题】:WebGL indices array sizeWebGL 索引数组大小
【发布时间】:2017-03-22 06:46:58
【问题描述】:

对于我的一个 WebGL 项目,我需要生成大量带有索引的对象。 例如,锥体。当 JavaScript 生成的不是那么多时,一切正常 很好,通过向场景中添加另一个锥体,渲染会出现故障。

我很确定问题出在定义索引缓冲区:

*var iBuffer = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, iBuffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint8Array(glIndices), gl.STATIC_DRAW);*

更具体地使用 Unit8Array 或其过渡到着色器。

谁能帮我解决这个问题?

【问题讨论】:

  • 抱歉,当然是 Uint8Array
  • Uint16Array怎么样?!

标签: javascript opengl-es buffer webgl indices


【解决方案1】:

如果您将 Uint8 用于索引,则您将自己限制为每个 drawcall 最多 256 个唯一顶点,因此如果您批量绘制,您可能会超过 Uint8 的最大值,而整数截断可能意味着您最终会得到跨模型的有效随机顶点连接。

增加到 Uint16 索引将使您每次绘制有 65536 个唯一顶点。

【讨论】:

  • 这就是我首先所做的,但似乎将 Uint8Array 更改为 Uint16Array 我需要更改其他内容,因为在这种情况下脚本总是呈现同样的混乱。也许我需要以某种方式更改此行: gl.drawElements( gl.TRIANGLES, indices.length, gl.UNSIGNED_BYTE, 0 );
  • gl.UNSIGNED_BYTE != 16 位。
  • 是的,这就是我发布 gl.drawElements 行的原因,但我可以找到应该替换的内容。我试过 UNSIGNED_SHORT,但脚本停止工作,也许我也必须在着色器中更改变量类型。
  • 根据 WebGL 参考只有两个选项:UNSIGNED_BYTE 和 UNSIGNED_SHORT(16 位),所以我尝试实现短,但一切都停止工作返回 Offscreen-For-WebGL-0x7f9227023400 ]GL ERROR :GL_INVALID_OPERATION : glDrawElements: range out of bounds for buffer
  • 我试过这样:var buf = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, buf); gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(glIndices), gl.STATIC_DRAW); var iBuffer = gl.createBuffer(); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buf);变量索引 = [3, 2, 1]; //或 2, 1, 0 gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);但是它返回 INVALID_OPERATION: bindBuffer: buffers can not be used with multiple targetsINVALID_OPERATION: bufferData: no buffer
猜你喜欢
  • 2015-05-16
  • 2019-03-07
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 2017-03-28
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多