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

时间:2016-06-16 22:24:41

标签: javascript google-chrome webgl

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;
}

我没有想法

2 个答案:

答案 0 :(得分:0)

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

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

编辑:也许还要给this尝试反省一下缓冲区,确保它的大小正确,看看有多少被使用

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

答案 1 :(得分:0)

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