Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数组缓冲区不适用于webgl_Javascript_Webgl_Arraybuffer - Fatal编程技术网

Javascript 数组缓冲区不适用于webgl

Javascript 数组缓冲区不适用于webgl,javascript,webgl,arraybuffer,Javascript,Webgl,Arraybuffer,我目前正在尝试使用带有视图的arraybuffer,将3个float32(x,y,z)和4个uint8(r,g,b,a)组合到一个数据流中,我可以传递到我的web gl应用程序 问题是,当我使用数组缓冲区时,什么都不起作用,代码如下: var buffer = new ArrayBuffer(nbrOfVertices * 16); var positionView = new DataView(buffer); for (var j = 0; j < nbrOfVertices;

我目前正在尝试使用带有视图的arraybuffer,将3个float32(x,y,z)和4个uint8(r,g,b,a)组合到一个数据流中,我可以传递到我的web gl应用程序

问题是,当我使用数组缓冲区时,什么都不起作用,代码如下:

var buffer = new ArrayBuffer(nbrOfVertices * 16);
var positionView = new DataView(buffer);   

for (var j = 0; j < nbrOfVertices; j++)
{
    positionView.setFloat32((j*16),meshVertexPositions[(j*7)]);
    positionView.setFloat32((j*16)+4,meshVertexPositions[(j*7)+1]);
    positionView.setFloat32((j*16)+8,meshVertexPositions[(j*7)+2]); 
}
gl.bufferData(gl.ARRAY_BUFFER,buffer,gl.STATIC_DRAW);
var buffer=newarraybuffer(nbrof顶点*16);
变量位置视图=新数据视图(缓冲区);
对于(var j=0;j<0;j++)
{
positionView.setFloat32((j*16),meshVertexPositions[(j*7)];
setFloat32((j*16)+4,meshVertexPositions[(j*7)+1]);
positionView.setFloat32((j*16)+8,meshVertexPositions[(j*7)+2]);
}
gl.bufferData(gl.ARRAY\u BUFFER,BUFFER,gl.STATIC\u DRAW);
我知道所有其他代码都是正确的,因为当我使用此代码时,它会起作用:

var buffer = new Float32Array(nbrOfVertices * 4);

for (var j = 0; j < nbrOfVertices; j++)
{
    buffer[(j*4)] = meshVertexPositions[(j*7)];
    buffer[(j*4)+1] = meshVertexPositions[(j*7)+1];
    buffer[(j*4)+2] = meshVertexPositions[(j*7)+2];
}
gl.bufferData(gl.ARRAY_BUFFER,buffer,gl.STATIC_DRAW);
var buffer=新的Float32Array(nbrof顶点*4);
对于(var j=0;j<0;j++)
{
缓冲区[(j*4)]=meshVertexPositions[(j*7)];
缓冲区[(j*4)+1]=meshVertexPositions[(j*7)+1];
缓冲区[(j*4)+2]=meshVertexPositions[(j*7)+2];
}
gl.bufferData(gl.ARRAY\u BUFFER,BUFFER,gl.STATIC\u DRAW);
你知道为什么我的arraybuffer代码(第一个示例)不起作用吗?
只是为了澄清一下,当我说它不工作时,我的意思是没有任何渲染,尽管我在运行它时(在chrome developer控制台或webgl inspector中)没有看到任何错误。

您不应该为此使用
数据视图。您将在同一缓冲区上使用多个视图,如下所示

var buffer = new ArrayBuffer(nbrOfVertices * 16);
var floatView = new Float32Array(buffer);
var uint8View = new Uint8Array(buffer);

for (var j = 0; j < nbrOfVertices; ++j) {
  var floatVertexOffset = j * 4;
  floatView[floatVertexOffset + 0] = meshVertexPositions[?? + 0];
  floatView[floatVertexOffset + 1] = meshVertexPositions[?? + 1];
  floatView[floatVertexOffset + 2] = meshVertexPositions[?? + 2];

  var uint8ColorOffset = j * 16 + 12;
  unit8View[uint8ColorOffset + 0] = meshVertexColors[?? + 0];
  unit8View[uint8ColorOffset + 1] = meshVertexColors[?? + 1];
  unit8View[uint8ColorOffset + 2] = meshVertexColors[?? + 2];
  unit8View[uint8ColorOffset + 3] = meshVertexColors[?? + 3];
}
var buffer=newarraybuffer(nbrof顶点*16);
var floatView=新的Float32Array(缓冲区);
var uint8View=新的Uint8Array(缓冲区);
对于(var j=0;j
您不使用数据视图的原因是您希望GPU数据采用本机浮点和RGBA格式
DataView
用于以特定的endian格式读取/写入数据,而与本机平台的endian无关


换句话说,如果你使用
DataView
,你最终会将错误类型的数据上传到GPU。您可以使用
DataView
读取本机格式或将本机数据转换为特定的二进制格式。

多亏了一百万人,我在这方面已经坚持了两天了。如果您指定了endianness,您可以使用DataView。我不得不在一个跨平台项目中使用它,在我指定了endianness之后它就开始工作了。