Google chrome 如果在程序中使用属性时未启用并绑定缓冲区,会发生什么情况?

Google chrome 如果在程序中使用属性时未启用并绑定缓冲区,会发生什么情况?,google-chrome,webgl,Google Chrome,Webgl,最近,当我阅读webgl规范时,我有一个关于以下的问题,因为我的程序在chrome浏览器上随机出现错误: 如果在程序中使用属性而不绑定缓冲区,并且在调用DrawArray或drawElements期间启用该属性,会发生什么情况 规范仅说明: 如果顶点属性作为数组启用,则缓冲区将绑定到 该属性,但该属性不被当前 程序,则无论绑定缓冲区的大小,它都不会 导致在调用DrawArray或 抽屉组件 如果通过将顶点属性启用为数组 EnableVertexAttributeArray,但没有缓冲区通过绑定到

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

如果在程序中使用属性而不绑定缓冲区,并且在调用DrawArray或drawElements期间启用该属性,会发生什么情况

规范仅说明:

如果顶点属性作为数组启用,则缓冲区将绑定到 该属性,但该属性不被当前 程序,则无论绑定缓冲区的大小,它都不会 导致在调用DrawArray或 抽屉组件

如果通过将顶点属性启用为数组 EnableVertexAttributeArray,但没有缓冲区通过绑定到该属性 bindBuffer和VertexAttribute指针,然后调用DrawArray或 抽屉元素将生成无效的\u操作错误


有人能帮我一下吗?

第二段说,如果启用属性但不绑定缓冲区,您总是会出错

有4种可能性

  • 使用缓冲区绑定启用了一个属性,当前着色器程序使用该属性

    在这种情况下,缓冲区必须足够大,以处理您试图绘制的任何内容。换句话说,如果您有一个具有3个顶点的缓冲区,但您要求WebGL绘制4个顶点,您将得到一个错误。或者,如果调用
    gl.drawerelements
    ,并且其中一个索引大于2,则会出现错误

  • 您使用缓冲区绑定启用了一个属性,并且当前着色器程序未使用该属性

    在这种情况下,即使缓冲区不够大,也不会出现错误,因为缓冲区未被使用

  • 您有一个启用了无缓冲区绑定的属性

    在这种情况下,您将始终得到一个错误

  • 您禁用了一个属性

    在这种情况下,它将使用调用
    gl.vertexAttrib4f
    或其变体提供的值


  • 您从规范中引用的两段内容涵盖了上述案例2和案例3。

    那么,您到底想要什么?正如规范所说,在没有绑定缓冲区的情况下启用属性数组是无效的。@TwilightSun是的,如果我的存储程序将使用该属性,但该属性未绑定到缓冲区,并且尚未启用。结果将随机在我的HTC One上的chrome上失败和成功。但它在HTC One上的firefox浏览器上总是成功的。我对这种行为很好奇。顺便说一句,在三星Note2上,它在chrome和firefox上都会成功。HTC One和三星上的chrome和firefox版本完全相同。这项测试在两种浏览器上都通过了吗?spec文档只描述了api应该是什么样子,但实际实现在不同的供应商之间有所不同。特别是他们如何对待错误。