我收到错误:GL_INVALID_OPERATION:glDrawElements:范围超出缓冲区错误范围

时间:2017-09-28 17:31:01

标签: javascript webgl

在绘制带有一些看似无害的数据的基本元素时,我得到了一个越​​界错误。我有(为此大小道歉):

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*/

  ];

...我认为它会再次绘制相同的三角形,我得到同样的错误。所以在我看来,投诉与顶点索引数据缓冲区的大小有关。

1 个答案:

答案 0 :(得分:0)

问题不在于数据,而在于数据的使用。简而言之,我只绑定了保存顶点索引信息的元素缓冲区,而不是每次调用render()方法时。由于有两个着色器,一个用于颜色,一个用于纹理,因此纹理着色器的元素缓冲区是唯一使用的着色器,因为它是绑定到最后一个的着色器。如果它仍然有效还不值得花时间去发现,我猜测两个着色器的属性偏移等是相同的。这解释了为什么我可以选择顶点索引的任何值,并且一切看起来仍然有用。