Javascript 这段代码如何使缓冲区溢出
Chrome版本51.0.2704.84 在gl.bufferSubData行上,chrome显示: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
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”变量。案件结案。