在绘制带有一些看似无害的数据的基本元素时,我得到了一个越界错误。我有(为此大小道歉):
const vertexColourData = [
1.0, 0.0, 0.0, 1.0,
1.0, 0.0, 0.0, 1.0,
1.0, 0.0, 0.0, 1.0,
1.0, 0.0, 0.0, 1.0,
0.0, 1.0, 1.0, 1.0,
0.0, 1.0, 1.0, 1.0,
0.0, 1.0, 1.0, 1.0,
0.0, 1.0, 1.0, 1.0,
0.0, 1.0, 0.0, 1.0,
0.0, 1.0, 0.0, 1.0,
0.0, 1.0, 0.0, 1.0,
0.0, 1.0, 0.0, 1.0,
1.0, 0.0, 1.0, 1.0,
1.0, 0.0, 1.0, 1.0,
1.0, 0.0, 1.0, 1.0,
1.0, 0.0, 1.0, 1.0,
0.0, 0.0, 1.0, 1.0,
0.0, 0.0, 1.0, 1.0,
0.0, 0.0, 1.0, 1.0,
0.0, 0.0, 1.0, 1.0,
1.0, 1.0, 0.0, 1.0,
1.0, 1.0, 0.0, 1.0,
1.0, 1.0, 0.0, 1.0,
1.0, 1.0, 0.0, 1.0/*,
1.0, 0.0, 0.0, 1.0,
1.0, 0.0, 0.0, 1.0,
1.0, 0.0, 0.0, 1.0,
1.0, 0.0, 0.0, 1.0,
0.0, 1.0, 1.0, 1.0,
0.0, 1.0, 1.0, 1.0,
0.0, 1.0, 1.0, 1.0,
0.0, 1.0, 1.0, 1.0,
0.0, 1.0, 0.0, 1.0,
0.0, 1.0, 0.0, 1.0,
0.0, 1.0, 0.0, 1.0,
0.0, 1.0, 0.0, 1.0,
1.0, 0.0, 1.0, 1.0,
1.0, 0.0, 1.0, 1.0,
1.0, 0.0, 1.0, 1.0,
1.0, 0.0, 1.0, 1.0,
0.0, 0.0, 1.0, 1.0,
0.0, 0.0, 1.0, 1.0,
0.0, 0.0, 1.0, 1.0,
0.0, 0.0, 1.0, 1.0,
1.0, 1.0, 0.0, 1.0,
1.0, 1.0, 0.0, 1.0,
1.0, 1.0, 0.0, 1.0,
1.0, 1.0, 0.0, 1.0*/
],
vertexPositionData = [
-1.0, -1.0, +1.0,
+1.0, -1.0, +1.0,
+1.0, +1.0, +1.0,
-1.0, +1.0, +1.0,
-1.0, -1.0, -1.0,
-1.0, +1.0, -1.0,
+1.0, +1.0, -1.0,
+1.0, -1.0, -1.0,
-1.0, +1.0, -1.0,
-1.0, +1.0, +1.0,
+1.0, +1.0, +1.0,
+1.0, +1.0, -1.0,
-1.0, -1.0, -1.0,
+1.0, -1.0, -1.0,
+1.0, -1.0, +1.0,
-1.0, -1.0, +1.0,
+1.0, -1.0, -1.0,
+1.0, +1.0, -1.0,
+1.0, +1.0, +1.0,
+1.0, -1.0, +1.0,
-1.0, -1.0, -1.0,
-1.0, -1.0, +1.0,
-1.0, +1.0, +1.0,
-1.0, +1.0, -1.0/*,
-1.0, -1.0, +1.0,
+1.0, -1.0, +1.0,
+1.0, +1.0, +1.0,
-1.0, +1.0, +1.0,
-1.0, -1.0, -1.0,
-1.0, +1.0, -1.0,
+1.0, +1.0, -1.0,
+1.0, -1.0, -1.0,
-1.0, +1.0, -1.0,
-1.0, +1.0, +1.0,
+1.0, +1.0, +1.0,
+1.0, +1.0, -1.0,
-1.0, -1.0, -1.0,
+1.0, -1.0, -1.0,
+1.0, -1.0, +1.0,
-1.0, -1.0, +1.0,
+1.0, -1.0, -1.0,
+1.0, +1.0, -1.0,
+1.0, +1.0, +1.0,
+1.0, -1.0, +1.0,
-1.0, -1.0, -1.0,
-1.0, -1.0, +1.0,
-1.0, +1.0, +1.0,
-1.0, +1.0, -1.0*/
],
vertexNormalData = [
0.0, 0.0, +1.0,
0.0, 0.0, +1.0,
0.0, 0.0, +1.0,
0.0, 0.0, +1.0,
0.0, 0.0, -1.0,
0.0, 0.0, -1.0,
0.0, 0.0, -1.0,
0.0, 0.0, -1.0,
0.0, +1.0, 0.0,
0.0, +1.0, 0.0,
0.0, +1.0, 0.0,
0.0, +1.0, 0.0,
0.0, -1.0, 0.0,
0.0, -1.0, 0.0,
0.0, -1.0, 0.0,
0.0, -1.0, 0.0,
+1.0, 0.0, 0.0,
+1.0, 0.0, 0.0,
+1.0, 0.0, 0.0,
+1.0, 0.0, 0.0,
-1.0, 0.0, 0.0,
-1.0, 0.0, 0.0,
-1.0, 0.0, 0.0,
-1.0, 0.0, 0.0/*,
0.0, 0.0, +1.0,
0.0, 0.0, +1.0,
0.0, 0.0, +1.0,
0.0, 0.0, +1.0,
0.0, 0.0, -1.0,
0.0, 0.0, -1.0,
0.0, 0.0, -1.0,
0.0, 0.0, -1.0,
0.0, +1.0, 0.0,
0.0, +1.0, 0.0,
0.0, +1.0, 0.0,
0.0, +1.0, 0.0,
0.0, -1.0, 0.0,
0.0, -1.0, 0.0,
0.0, -1.0, 0.0,
0.0, -1.0, 0.0,
+1.0, 0.0, 0.0,
+1.0, 0.0, 0.0,
+1.0, 0.0, 0.0,
+1.0, 0.0, 0.0,
-1.0, 0.0, 0.0,
-1.0, 0.0, 0.0,
-1.0, 0.0, 0.0,
-1.0, 0.0, 0.0*/
],
vertexIndexData = [
0, 1, 2,
0, 2, 3,
4, 5, 6,
4, 6, 7,
8, 9, 10,
8, 10, 11,
12, 13, 14,
12, 14, 15,
16, 17, 18,
16, 18, 19,
20, 21, 22,
20, 22, 23/*,
24, 25, 26,
24, 26, 27,
28, 29, 30,
28, 30, 31,
32, 33, 34,
32, 34, 35,
36, 37, 38,
36, 38, 39,
40, 41, 42,
40, 42, 43,
44, 45, 46,
44, 46, 47*/
];
当我取消注释除最后一个数组以外的所有数组时,一切正常。在这种情况下,颜色,法线和位置数据的两倍,而后半部分仍然未使用。
然而,当我取消注释vertexIndexData
数组的后半部分时,有效地使用最后一个顶点,我得到以下错误:
错误:GL_INVALID_OPERATION:
glDrawElements
:范围超出缓冲区范围
我无法看到我的数学错误。有没有人有任何想法?
更新:它与顶点索引数据的实际值无关。如果我尝试以下......
vertexIndexData = [
0, 1, 2,
0, 2, 3,
4, 5, 6,
4, 6, 7,
8, 9, 10,
8, 10, 11,
12, 13, 14,
12, 14, 15,
16, 17, 18,
16, 18, 19,
20, 21, 22,
20, 22, 23,
0, 1, 2,
0, 2, 3,
4, 5, 6,
4, 6, 7,
8, 9, 10,
8, 10, 11,
12, 13, 14,
12, 14, 15,
16, 17, 18,
16, 18, 19,
20, 21, 22,
20, 22, 23/*,
24, 25, 26,
24, 26, 27,
28, 29, 30,
28, 30, 31,
32, 33, 34,
32, 34, 35,
36, 37, 38,
36, 38, 39,
40, 41, 42,
40, 42, 43,
44, 45, 46,
44, 46, 47*/
];
...我认为它会再次绘制相同的三角形,我得到同样的错误。所以在我看来,投诉与顶点索引数据缓冲区的大小有关。
答案 0 :(得分:0)
问题不在于数据,而在于数据的使用。简而言之,我只绑定了保存顶点索引信息的元素缓冲区,而不是每次调用render()
方法时。由于有两个着色器,一个用于颜色,一个用于纹理,因此纹理着色器的元素缓冲区是唯一使用的着色器,因为它是绑定到最后一个的着色器。如果它仍然有效还不值得花时间去发现,我猜测两个着色器的属性偏移等是相同的。这解释了为什么我可以选择顶点索引的任何值,并且一切看起来仍然有用。