IE 11 bufferData() 没有 allocate/transfer 数据到 VBO
IE 11 bufferData() does not allocate/transfer data to VBO
我在使用 IE 11 时遇到问题,bufferData 调用的参数是 DataView 实例。在 IE 11 中,这会导致调用 drawArrays() 期间出现 INVALID_OPERATION: drawArrays: Insufficient buffer size 错误。该代码适用于 Chrome 61 和 Firefox 56。
我的问题是针对有经验的 WebGL/JS 开发人员的,无论这是 IE 错误还是我对 DataView 的滥用以及任何解决方法。在我的应用程序中,我想要的设计是:分配一个字节数组缓冲区,根据程序某些部分的上下文使用适当的数据视图(如 Float32Array)对其进行操作,然后将其复制到程序不同部分的 WebGL VBO 缓冲区程序而不必找出特定的 DataView 实例(如 Float32Array)。
我使用来自 soulwire http://jsfiddle.net/soulwire/XLnVW/ as a base. My modifications are posted below and available http://jsfiddle.net/1h3225uj/4/:
的简单三角形 WebGL 示例复制了该问题
function initBuffers() {
//allocate space for 3 * vec3 * 4 bytes/component
rawPolygonArrayBuffer = new ArrayBuffer(3 * 3 * 4);
//fill vertices using Float32Array view
float32PolygonArrayBufferView = new Float32Array(rawPolygonArrayBuffer);
float32PolygonArrayBufferView[0] = -0.5;
float32PolygonArrayBufferView[1] = -0.5;
float32PolygonArrayBufferView[2] = 0.0;
float32PolygonArrayBufferView[3] = 0.0;
float32PolygonArrayBufferView[4] = 0.5;
float32PolygonArrayBufferView[5] = 0.0;
float32PolygonArrayBufferView[6] = 0.5;
float32PolygonArrayBufferView[7] = -0.5;
float32PolygonArrayBufferView[8] = 0.0;
//Create a generic view into ArrayBuffer object
genericPolygonArrayBufferView = new DataView(rawPolygonArrayBuffer);
vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
//gl.bufferData(gl.ARRAY_BUFFER, float32PolygonArrayBufferView, gl.STATIC_DRAW); //<-- WORKS
gl.bufferData(gl.ARRAY_BUFFER, genericPolygonArrayBufferView, gl.STATIC_DRAW); //<-- Doesn't work
glBufferAllocatedBytes = gl.getBufferParameter(gl.ARRAY_BUFFER, gl.BUFFER_SIZE);
console.log("glBufferAllocatedBytes: " + glBufferAllocatedBytes);
console.log("rawPolygonArrayBuffer.byteLength: " + rawPolygonArrayBuffer.byteLength);
}
console.log 显示 VBO 缓冲区大小在 IE 上为 0 字节,在 Firefox/Chrome 中为 36 字节。
WebGL spec states bufferData
and bufferSubData
to accept BufferSource
s which is in turn specified on MDN为:
BufferSource is a typedef used to represent objects that are either themselves an ArrayBuffer, or which are a TypedArray providing an ArrayBufferView.
DataView
是其中的 none,但是它确实通过其 buffer
成员公开了其基础 ArrayBuffer
,因此您可以简单地使用它来上传数据:
gl.bufferData(gl.ARRAY_BUFFER, genericPolygonArrayBufferView.buffer, gl.STATIC_DRAW);
我在使用 IE 11 时遇到问题,bufferData 调用的参数是 DataView 实例。在 IE 11 中,这会导致调用 drawArrays() 期间出现 INVALID_OPERATION: drawArrays: Insufficient buffer size 错误。该代码适用于 Chrome 61 和 Firefox 56。
我的问题是针对有经验的 WebGL/JS 开发人员的,无论这是 IE 错误还是我对 DataView 的滥用以及任何解决方法。在我的应用程序中,我想要的设计是:分配一个字节数组缓冲区,根据程序某些部分的上下文使用适当的数据视图(如 Float32Array)对其进行操作,然后将其复制到程序不同部分的 WebGL VBO 缓冲区程序而不必找出特定的 DataView 实例(如 Float32Array)。
我使用来自 soulwire http://jsfiddle.net/soulwire/XLnVW/ as a base. My modifications are posted below and available http://jsfiddle.net/1h3225uj/4/:
的简单三角形 WebGL 示例复制了该问题function initBuffers() {
//allocate space for 3 * vec3 * 4 bytes/component
rawPolygonArrayBuffer = new ArrayBuffer(3 * 3 * 4);
//fill vertices using Float32Array view
float32PolygonArrayBufferView = new Float32Array(rawPolygonArrayBuffer);
float32PolygonArrayBufferView[0] = -0.5;
float32PolygonArrayBufferView[1] = -0.5;
float32PolygonArrayBufferView[2] = 0.0;
float32PolygonArrayBufferView[3] = 0.0;
float32PolygonArrayBufferView[4] = 0.5;
float32PolygonArrayBufferView[5] = 0.0;
float32PolygonArrayBufferView[6] = 0.5;
float32PolygonArrayBufferView[7] = -0.5;
float32PolygonArrayBufferView[8] = 0.0;
//Create a generic view into ArrayBuffer object
genericPolygonArrayBufferView = new DataView(rawPolygonArrayBuffer);
vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
//gl.bufferData(gl.ARRAY_BUFFER, float32PolygonArrayBufferView, gl.STATIC_DRAW); //<-- WORKS
gl.bufferData(gl.ARRAY_BUFFER, genericPolygonArrayBufferView, gl.STATIC_DRAW); //<-- Doesn't work
glBufferAllocatedBytes = gl.getBufferParameter(gl.ARRAY_BUFFER, gl.BUFFER_SIZE);
console.log("glBufferAllocatedBytes: " + glBufferAllocatedBytes);
console.log("rawPolygonArrayBuffer.byteLength: " + rawPolygonArrayBuffer.byteLength);
}
console.log 显示 VBO 缓冲区大小在 IE 上为 0 字节,在 Firefox/Chrome 中为 36 字节。
WebGL spec states bufferData
and bufferSubData
to accept BufferSource
s which is in turn specified on MDN为:
BufferSource is a typedef used to represent objects that are either themselves an ArrayBuffer, or which are a TypedArray providing an ArrayBufferView.
DataView
是其中的 none,但是它确实通过其 buffer
成员公开了其基础 ArrayBuffer
,因此您可以简单地使用它来上传数据:
gl.bufferData(gl.ARRAY_BUFFER, genericPolygonArrayBufferView.buffer, gl.STATIC_DRAW);