2012-03-06 42 views
4

float64/int64Arrays [编辑 - 一个问题几乎是固定的,变化的问题,以反映它]包装数据:在Chrome

我工作在Chrome点云WebGL的项目,该项目以显示数百万个点时间。为了使效率更高,我试着将我的数据(6个xyz和rgb浮点数)打包成两个64位整数(xy & zrgb),并且计划将它们解压到着色器中。

我正在开发Chrome,并且afaict,webkit不支持任何类型的64位数组类型......甚至使用Canary。此外,Firefox确实支持64位阵列,但我仍然遇到错误。这条线发生

的问题:

gl.bufferData(gl.ARRAY_BUFFER, new Float64Array(data.xy), gl.DYNAMIC_DRAW); 

在Chrome中我得到ArrayBufferView不是一个足够小的正整数,在FF我收到“无效的参数”。

所以我的问题是,有没有办法发送64位数字着色器,最好是使用Chrome,如果没有,在FF?

此外,打包数据是这样一个好主意吗?有小费吗?!

感谢,

约翰

+0

我不完全相信包装你描述的方式会更有效率。你以前如何暴露xyz/rgb数据? – Toji 2012-03-06 16:18:21

回答

7

重要的是要知道的WebGL其实没有丝毫关于您提供它TypedArray的格式关心。不管你给它什么,它都会把它当作一个不透明的二进制缓冲区。重要的是你如何设置你的vertexAttribPointer。这允许来回混洗数据的一些非常方便的方法。例如:我经常从二进制文件中读取一个Uint8Array,并将其作为缓冲区数据提供,但将其绑定为浮点数和整数。

TypedArrays也具有很好的能力,可以充当其他数组类型的视图,这使得混合类型变得很容易(只要你没有对齐问题)。在特定情况下,我建议做这样的事情:

var floatBuffer = new Float32Array(verts.length * 4); 
var byteBuffer = new Uint8Array(floatBuffer); // View the floatBuffer as bytes 

for(i = 0; i < verts.length; ++i) { 
    floatBuffer[i * 4 + 0] = verts.x; 
    floatBuffer[i * 4 + 1] = verts.y; 
    floatBuffer[i * 4 + 2] = verts.z; 

    // RGBA values expected as 0-255 
    byteBuffer[i * 16 + 12] = verts.r; 
    byteBuffer[i * 16 + 13] = verts.g; 
    byteBuffer[i * 16 + 14] = verts.b; 
    byteBuffer[i * 16 + 15] = verts.a; 
} 

var vertexBuffer = gl.createBuffer(); 
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); 
gl.bufferData(gl.ARRAY_BUFFER, floatBuffer, gl.STATIC_DRAW); 

这将上传包含3辆32位的花车和132种颜色的GPU紧密包装的顶点缓冲。不像你提出的一对64位整数那么小,但GPU可能会更好地工作。当绑定它渲染以后,你会做这样这样的:

gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); 
gl.vertexAttribPointer(attributes.aPosition, 3, gl.FLOAT, false, 16, 0); 
gl.vertexAttribPointer(attributes.aColor, 4, gl.UNSIGNED_BYTE, false, 16, 12); 

与相应的着色器代码看起来像这样:

attribute vec3 aPosition; 
attribute vec4 aColor; 

void main() { 
    // Manipulate the position and color as needed 
} 

这种方式,你必须使用交错阵列的好处,这GPU喜欢使用,并且只需要跟踪一个缓冲区(奖金!),而且不会浪费每个颜色分量的完整浮动空间。如果你真的希望变小,你可以用短裤代替花车,但我过去的经验表明,使用短属性时桌面GPU不是非常快。

希望有帮助!

+0

是的,真的很有帮助!我开始意识到我正在做的事情并不真正起作用 - 我会放弃这一点。 – Fridge 2012-03-07 16:32:10