这段代码如何使缓冲区溢出

How can this code make buffer overflow

Chrome 版本 51.0.2704.84

在 gl.bufferSubData 行,chrome 说:

WebGL: INVALID_VALUE: bufferSubData: buffer overflow

请注意,我使用 maxAmountWritten 变量跟踪 VBO 的长度。当我用 bufferData 设置它的大小时,我什至让它长了 1 个元素。因此 subBufferData 不可能覆盖 VBO 的边缘。

实际代码:

updatePlacementVBO() {
    var gl = this.sceneApi.getGlContext();

    var paramsVbo = this.placementVBO;
    if (!paramsVbo) {
        paramsVbo = gl.createBuffer();
        this.maxAmountWritten = 0;
    }
    var written = 0;
    var permanentBuffer = [];
    for (var i = 0; i < this.mdxObjectList.length; i++) {
        var mdxObject = this.mdxObjectList[i];
        if (!mdxObject.getIsRendered()) continue;

        var placementMatrix = mdxObject.placementMatrix;
        var diffuseColor = mdxObject.getDiffuseColor();
        for (var j = 0; j < 16; j++) {
            permanentBuffer[i*20+j] = placementMatrix[j];
        }
        for (var j = 0; j < 4; j++) {
            permanentBuffer[i*20+16+j] = diffuseColor[j];
        }

        written++;
    }

    if (written>0) {
        gl.bindBuffer(gl.ARRAY_BUFFER, paramsVbo);
        if (written > this.maxAmountWritten) {
            permanentBuffer[permanentBuffer.length] = 0;

            var typedBuf = new Float32Array(permanentBuffer);
            gl.bufferData(gl.ARRAY_BUFFER, typedBuf, gl.DYNAMIC_DRAW);

            this.maxAmountWritten = written;
        } else {
            gl.bufferSubData(gl.ARRAY_BUFFER, 0, new Float32Array(permanentBuffer));
        }
    }
    this.placementVBO = paramsVbo;
    this.lastUpdatedNumber = written;
}

我没主意了

看起来 paramsVBO 是调用 else 语句时的绑定缓冲区,并且没有调用 bufferData 以使用任何信息初始化该缓冲区目标

有关创建缓冲区的信息,请参阅 this link。除此之外,看起来你走在正确的轨道上,只是缓冲区没有被初始化(无论如何从表面上看)

编辑:也许还 this 尝试检查缓冲区,确保它的大小正确并查看使用了多少

gl.getBufferParameter(gl.ARRAY_BUFFER, gl.BUFFER_SIZE);

我遇到了缓冲区溢出,因为我将缓冲区初始化为 Uint8Array() 数组,然后用 Float32Array()

替换了该缓冲区