2015-04-19 254 views
0

爲什麼當我更改positionViewcolorView時,緩衝區也會發生變化?爲什麼ArrayBuffer更改值?

var buffer = new ArrayBuffer(nbrOfVertices * vertexSizeInBytes); 
var positionView = new Float32Array(buffer); 
var colorView = new Uint8Array(buffer); 
+0

你是什麼意思_changed_?似乎保持不變...... – Xufox

+1

這兩個視圖都寫入相同的底層緩衝區。如果需要將它們分開,請將其複製。 –

+0

哦,你的意思是,當你實際賦予'positionView'或'colorView'值。 – Xufox

回答

1

所有typed array structures是在一個ArrayBuffer意見。它們允許您以選擇的佈局(如32位浮點數)訪問和修改ArrayBuffer內的基礎二進制數據。

如果你想使用的頂點乘以組件作爲參數的數量的數量創建單獨的緩衝區,你可以只創建你的位置 - 和colorbuffers,這隱含通過視圖的buffer屬性創建一個基本ArrayBuffer accessable 。

var numVertices = 4; 
var positions = new Float32Array(numVertices * 3 /*position: x, y, z*/); 
var colors = new Uint8Array(numVertices * 4 /*color: r, g, b, a*/); 

如果你想建立一個隔行VertexBuffer與佈局:f32pX,f32pY,f32pZ,ui8cR,ui8cG,ui8cB,ui8cA「對飛」 你colorView也是「意見」的浮點數據,所以你必須通過12個字節來抵消你的作品。

var positionOffset = 3 * 4;//3 positions with 4 byte each 
var bufferOffset = positionOffset+4;//each color component is 1 byte 
for (
    var colorStart = positionOffset; 
    colorStart < colorView.length; 
    colorStart += bufferOffset 
) { 
    colorView[colorStart]=r; 
    colorView[colorStart+1]=g; 
    colorView[colorStart+2]=b; 
    colorView[colorStart+3]=a; 
} 
相關問題