gpt4 book ai didi

javascript - WebGL:glDrawElements 超出顶点边界

转载 作者:行者123 更新时间:2023-12-02 14:59:41 24 4
gpt4 key购买 nike

我在 WebGL 中构建了一个二维网格。它有 5 列、24 行。我的网格中的每个“单元”都是四个顶点和六个索引:

所以对于每个单元格,我都会:

var addCell = function(x, y, w, h, colorArray) {
len = vertices.length;

vertices.push(x, y, zIndex);
vertices.push(x, y - h, zIndex);
vertices.push(x + w, y - h, zIndex);
vertices.push(x + w, y, zIndex);

Array.prototype.push.apply(colors, colorArray);
Array.prototype.push.apply(colors, colorArray);
Array.prototype.push.apply(colors, colorArray);
Array.prototype.push.apply(colors, colorArray);

indices.push(len, len + 1, len + 2);
indices.push(len, len + 2, len + 3);
}

其中 x 和 y 是单元格的坐标,“colors”是指定 rgba 的四元素数组。因此,我从左到右创建第一行,然后创建第二行,依此类推。当我创建索引缓冲区时,我会:

indexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint8Array(indices), gl.STATIC_DRAW);

当我绘制场景时,我会说:

gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_BYTE, 0);

当我这样做时,它只渲染前 12 3/4 行(共 24 行)。这是因为每个单元有 4 个顶点(相邻单元不共享顶点)。因此前 12 行以上包含:12.75 * 5 * 4 = 255 <- GL_UNSIGNED_BYTE 的最大值。

所以对我来说,考虑到我的类型选择,这是一个显而易见的结果。我自然认为解决方案是更改为 gl.UNSIGNED_SHORT 并将缓冲区的创建更改为:

gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);

然而,这会导致“glDrawElements:尝试访问属性 0 中超出范围的顶点”。

我盯着我的索引/顶点构建代码有一段时间,试图看看我是否添加了一个指向不存在的顶点元素的索引。我没有发现该代码有任何问题,这让我认为它与我选择的类型有关。任何方向将不胜感激。

最佳答案

有了UNSIGNED_SHORT,您就走在正确的道路上了。 See this answer关于您收到的新错误的含义:有一个引用不存在的顶点的索引。

这是因为您的 len 已关闭。每个索引引用一个顶点,每个顶点由 3 个值组成。因此索引 0 引用前 3 个值,索引 1 引用第二个 3,依此类推。

改变

len = vertices.length;

len = vertices.length / 3;

应该修复它。

关于javascript - WebGL:glDrawElements 超出顶点边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35524432/

24 4 0
文章推荐: javascript - 调用 Flux Store 操作时 setState 并未更新状态
文章推荐: javascript - 如何使用 Javascript 保存静态变量,即使在刷新页面时也是如此
文章推荐: javascript - 如何使用javascript获取