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;
}
我没有想法
答案 0 :(得分:0)
当调用else语句并且没有调用bufferData来初始化具有任何信息的缓冲区目标时,看起来paramsVBO是绑定缓冲区
有关创建缓冲区的信息,请参阅this link。除此之外,看起来你是在正确的轨道上,只是缓冲区没有被初始化(无论如何都在表面上看)
编辑:也许还要给this尝试反省一下缓冲区,确保它的大小正确,看看有多少被使用
gl.getBufferParameter(gl.ARRAY_BUFFER,gl.BUFFER_SIZE);
答案 1 :(得分:0)
我遇到了缓冲区溢出,因为我将缓冲区初始化为Uint8Array()
数组,然后将其替换为Float32Array()