javascript - 这段代码如何导致缓冲区溢出

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

我没主意了

最佳答案

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

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

编辑:也许还可以给出 this尝试检查缓冲区,确保其大小正确并查看使用了多少

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

关于javascript - 这段代码如何导致缓冲区溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37870348/

相关文章:

php - 像谷歌搜索一样在 div 中加载外部 url

css - Chrome - 内联 css 有效但样式表无效

opengl-es - WebGL/OpenGL : Rotate camera according to device orientation

javascript - 从对象数组创建 PrimeNG TreeTable json

php - 动态下拉列表填充文本框

css - 谷歌地图没有边界半径

javascript - 无法让 Unicode 字体与 Three.js TextGeometry 一起使用

webgl - 使用 FabricJS 过滤器和自定义控件扭曲图像,通过从中心拖动角控制点调整图像大小

javascript - 滑入效果(自下而上)不起作用

javascript - Chrome JavaScript 错误 "WebkitURL is deprecated"