在 InterleavedBuffer 类中,建议将步幅设为默认值 0。 如果用户忘记指定步幅, this.stride
将具有值undefined
,这将级联到var stride = data.stride;
,并进一步到_gl.vertexAttribPointer
导致未定义的 webgl 行为。
为参数设置默认值意味着完全不指定值是可以的。 但是,在这种情况下,必须设置一个值。
此外,如果默认值为零,则下一行可以除以零。
三.js 一般不检查参数值。
不幸的是,没有办法强制用户设置该值,与 C++ 不同,它将在编译时检测到。 如果必须设置,为什么不抛出错误以防它没有设置而不是静默通过并返回奇怪的图形行为? 作为three.js 的新用户,我浪费了很多时间来找出问题所在,而且我很确定我不会是唯一会陷入这个陷阱的人。
没有办法阻止用户将 0 分配给stride
,这会导致刚刚提到的@WestLangley被零除的问题。
此处的 API 文档未能明确说明stride
的含义。 根据我对 OpenGL/WebGL API 的经验,这里的stride
是顶点属性的原始元素的数量,浮点数或整数。 所以count
似乎是其属性在第一个参数array
中定义的顶点数。
而且,如果我错了,请纠正我, this.count
在整个WebGLRender中没有发现任何用法,而stride
已在关键的 GL 调用_gl.vertexAttribPointer
中使用stride
0 后,这并不完全正确,并且this.count
现在是Infinity
,它使我的渲染恢复正常,因为它从未被使用过在框架的什么地方。
所以,我建议设置一个安全防护来检查stride
的值,并在undefined
或0
的情况下提示用户。
是的,这就是 JavaScript,我们之前也有过这些讨论。
另一方面,如果您觉得文档不充分或不正确,这将是帮助我们改进它的好时机。 :)
在您引用的代码中, count
是顶点数。 该属性可能会或可能不会被渲染器使用,但如果需要,它是应用程序层可用的属性。
最有用的评论
为参数设置默认值意味着完全不指定值是可以的。 但是,在这种情况下,必须设置一个值。
此外,如果默认值为零,则下一行可以除以零。
三.js 一般不检查参数值。