如果在未启用并绑定缓冲区的程序中使用属性会发生什么?

时间:2014-01-15 03:13:48

标签: google-chrome webgl

最近,当我阅读webgl规范时。我有一个关于下面的问题,因为我的程序在Chrome浏览器上有随机错误:

如果在程序中使用属性而没有绑定缓冲区并在调用drawArrays或drawElements期间启用了会发生什么?

规范只说:

  

如果将顶点属性作为数组启用,则绑定缓冲区   该属性,但该属性不被当前消耗   程序,然后无论绑定缓冲区的大小,它都不会   导致在调用drawArrays或期间生成任何错误   drawElements。

     

如果通过顶点属性作为数组启用   enableVertexAttribArray但没有缓冲区通过该属性绑定   bindBuffer和vertexAttribPointer,然后调用drawArrays或   drawElements将生成INVALID_OPERATION错误

任何人都可以帮我吗?

1 个答案:

答案 0 :(得分:6)

第二段说明,如果你启用了一个属性但是没有绑定缓冲区,你总是会收到错误。

有4种可能性

  1. 您启用了一个带缓冲区绑定的属性,并且该属性由当前着色器程序使用。

    在这种情况下,缓冲区必须足够大,以处理您尝试绘制的内容。换句话说,如果你有一个带有3个顶点的缓冲区,但是你要求WebGL绘制4个顶点,你就会收到错误。或者,如果您拨打gl.drawElements并且其中一个索引大于2,则会收到错误。

  2. 您的属性已启用缓冲区绑定,并且当前着色器程序使用该属性 NOT

    在这种情况下,即使缓冲区不够大也没有错误,因为没有使用缓冲区。

  3. 您启用了 NO BUFFER 绑定的属性。

    在这种情况下,您将始终收到错误。

  4. 您已停用某个属性

    在这种情况下,它将使用通过调用gl.vertexAttrib4f或其中一个变体提供的值。

  5. 您从规范中引用的2个段落涵盖了上述案例2和3。