寻找关于实时绘制相当大的数据流的决定。我想通过GPU处理它以降低内存成本。
我找到了一个WebGL示例:
// Fill the buffer with the values that define a triangle.
function setGeometry(gl) {
gl.bufferData(
gl.ARRAY_BUFFER,
new Float32Array([
0, -100,
150, 125,
-175, 100]),
gl.STATIC_DRAW);
}
想澄清一些事情:
gl.ARRAY_BUFFER是否在GPU内创建缓冲区,而不是在RAM内?
Linux上的WebGL是否稳定?
UPDATE: 还想澄清一下,是否可以通过索引更新gl缓冲区的一部分。
答案 0 :(得分:1)
gl.createBuffer
和gl.bufferData
为WebGL创建缓冲区。这些是否在GPU上取决于平台和浏览器。 AFAIK所有英特尔GPU都将顶点数据存储在与其他CPU数据相同的内存中。另外一些WebGL实现也可能在CPU ram中存储缓冲区的副本,所以实际上没有办法知道。
gl.bufferData
设置缓冲区的大小并将数据放入其中。您不希望将数据放入大小而不是ArrayBuffer
// create buffer
var buf = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf);
// set it's size to 1024 bytes
gl.bufferData(g.ARRAY_BUFFER, 1024, gl.STATIC_DATA);
之后,您可以使用gl.bufferSubData
一次将数据放入其中。实施例
var offset = 100;
gl.bufferSubData(gl.ARRAY_BUFFER, offset, someArrayBufferOrView);
someArrayBufferORView
只是一个像
var someArrayBufferOrView = new Uint8Array(45);
在这种情况下,缓冲区将使用someArrayBufferOrView
或者如果您想使用ArrayBuffer的一部分,那么您可以进行视图
var someArrayBuffer = new Uint8Array(1024);
...
var bufferOffset = 200;
var bufferLength = 50;
var someArrayBufferOrView =
new Uint8Array(someArrayBuffer.buffer, bufferOffset, bufferLength);
这使得someArrayBufferOrView
成为someArrayBuffer
的视图,其中200个字节开始进入someArrayBuffer
并且长度为50个字节。
更好的问题是你为什么要这样做?拨打gl.bufferSubData
是相对的。例如,如果您为每个顶点调用一次,则需要比使用所有数据调用gl.bufferData
一次更长的时间。你提到减少内存成本。您正在尝试做的事情确实存在这将解决的内存问题吗?我知道知道这样做的WebGL应用程序。
答案 1 :(得分:0)
快速谷歌回答这个问题:http://webglfundamentals.org/webgl/lessons/webgl-how-it-works.html
缓冲区是将顶点和其他每个顶点数据放到GPU上的方法。 gl.createBuffer创建一个缓冲区。 gl.bindBuffer将该缓冲区设置为要处理的缓冲区。 gl.bufferData将数据复制到缓冲区中。
gl.Array_buffer是gl.bufferData()方法的参数,它将数据复制到先前在GPU中创建并绑定的缓冲区中。
如果它在linux上稳定,可能取决于linux版本和发布。如果您的PC的GPU支持WebGl,它还取决于您的硬件。