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 语句时的绑定(bind)缓冲区,并且没有调用 bufferData 来使用任何信息初始化该缓冲区目标
参见this link有关创建缓冲区的信息。除此之外,看起来您走在正确的轨道上,只是缓冲区没有被初始化(无论如何表面上看)
编辑:也许还可以给出 this尝试检查缓冲区,确保其大小正确并查看使用了多少
gl.getBufferParameter(gl.ARRAY_BUFFER, gl.BUFFER_SIZE);
关于javascript - 这段代码如何导致缓冲区溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37870348/