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

Javascript 这段代码如何使缓冲区溢出,javascript,google-chrome,webgl,Javascript,Google Chrome,Webgl,Chrome版本51.0.2704.84 在gl.bufferSubData行上,chrome显示: WebGL: INVALID_VALUE: bufferSubData: buffer overflow 请注意,我使用MaxAmountWrite变量跟踪VBO的长度。当我用bufferData设置它的大小时,我甚至让它长1个元素。因此,子缓冲区数据不可能写入VBO的边缘 实际代码: updatePlacementVBO() { var gl = this.sceneApi.getG

Chrome版本51.0.2704.84

在gl.bufferSubData行上,chrome显示:

WebGL: INVALID_VALUE: bufferSubData: buffer overflow
请注意,我使用MaxAmountWrite变量跟踪VBO的长度。当我用bufferData设置它的大小时,我甚至让它长1个元素。因此,子缓冲区数据不可能写入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;
}
updatePlacementVBO(){
var gl=this.sceneApi.getGlContext();
var paramsVbo=this.placementVBO;
如果(!paramsVbo){
paramsVbo=gl.createBuffer();
this.maxamontWrited=0;
}
var=0;
var permanentBuffer=[];
for(var i=0;i0){
gl.bindBuffer(gl.ARRAY_BUFFER,paramsVbo);
如果(已写入>此.MaxAmountWrited){
permanentBuffer[permanentBuffer.length]=0;
var typedBuf=新的Float32Array(permanentBuffer);
gl.bufferData(gl.ARRAY\u BUFFER、typedBuf、gl.DYNAMIC\u DRAW);
this.maxamountWrited=已写入;
}否则{
gl.bufferSubData(gl.ARRAY_BUFFER,0,新Float32Array(permanentBuffer));
}
}
this.placementVBO=paramsVbo;
this.lastUpdatedNumber=已写入;
}

我没有主意了

调用else语句时,paramsVBO似乎是绑定的缓冲区,没有调用bufferData以使用任何信息初始化缓冲区目标

有关创建缓冲区的信息,请参见。除此之外,看起来您走对了方向,只是缓冲区没有被初始化(不管怎样,从表面上看)

编辑:也可以试着对缓冲区进行内省,确保缓冲区大小正确,并查看使用了多少缓冲区


gl.getBufferParameter(gl.ARRAY\u BUFFER,gl.BUFFER\u SIZE)

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

有关创建缓冲区的信息,请参见。除此之外,看起来您走对了方向,只是缓冲区没有被初始化(不管怎样,从表面上看)

编辑:也可以试着对缓冲区进行内省,确保缓冲区大小正确,并查看使用了多少缓冲区


gl.getBufferParameter(gl.ARRAY\u BUFFER,gl.BUFFER\u SIZE)

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

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

谢谢。你的回答让我意识到我在循环中使用“I”作为索引,而不是“writed”变量。案子结案了,谢谢。你的回答让我意识到我在循环中使用“I”作为索引,而不是“writed”变量。案件结案。