2012-03-06 41 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