2017-09-01 250 views
2

我在Uint8array(3d x,y,z座標列表)中有一些數據。我需要執行一些浮點操作。 (矩陣旋轉變換乘法)在這個3d向量上。我正在使用http://glmatrix.net/庫進行計算。Javascript如何在CPU上重現GLSL浮點矩陣運算Uint8array

的數據是從第三方的API,將其打包Uint8Array頂點數據以套8 [x,y,z,w,r,g,b,a]

截至格式化直到現在來,我一直在GPU上執行此操作,通過這個Uint8array和旋轉矩陣給GLSL。我將操作轉移到脫機執行的基於CPU的腳本。

更新另一方程式。脫機腳本是一個node.js CLI腳本,它使用unix >運算符將最終緩衝區寫入stdout並最終寫入文件。然後我在最終的應用程序中加載這個文件,並使用typedArray構造函數包裝arrayBuffer

當GLSL執行,操作是這樣的:

matrix * vec4(vert.x, vert.y, vert.z, 1.0)

和我的結果如下: enter image description here

現在的CPU上我當前的代碼的嘗試是:

const vertData = getVertDataUint8(); 
    const rotation = mat4.fromRotation(mat4.identity([]), -Math.PI/2, [1,0,0]); 
    var i = 0; 
    while(i<vertData.length){ 
    const rotatedVerts = vec4.transformMat4([], 
              vec4.clone([vertData[i],vertData[i+1],vertData[i+2], 1]), 
              rotation); 

    vertData[i] = rotatedVerts[0]; 
    vertData[i+1] = rotatedVerts[1]; 
    vertData[i+2] = rotatedVerts[2]; 
    i+=8; 
    } 
我的結果如下:

我注意到,當重新賦值給vertData時,特別是負值,它們被轉換爲整數。例如-10〜= 246

,你可以在瀏覽器控制檯重現具有:

var u = new Uint8Array(1) 
undefined 
u[0] = -10 
-10 
u[0] 
246 

我試圖通過在Float32Array構造包裝,並使用Float32Array.from轉換Uint8ArrayFloat32Array,但它似乎產生相同的結果。

+2

首先:請使用Float32Array作爲頂點數據。你爲什麼使用'i + = 8;'?你的UInt8Array應該看起來像這樣:'[X1,Y1,Z1,...]'或者[X1,Y1,Z1,W1,...],所以你至少要跳過'i + = 8'每第二個垂直。 – Bellian

+0

@Bellian我應該補充一點,頂點數據來自不容易更新的第三方來源。我可以將'Uint8Array'轉換爲'Float32Array',此外,頂點格式實際上是8個屬性[x,y,z,w,r,g,b,a]的集合,因此可以以8爲單位進行迭代。 – kevzettler

回答

1

首先:考慮使用Float32Array作爲頂點信息。否則會出現大問題。或者至少使用非未簽名的數據格式。

現在您的問題:

由於Uint8Array是一個無符號的數據格式,它只會保存正8位值。所有負值將被解釋爲正數(10000000作爲有符號整數是-128,但作爲無符號它是128

但我想真正的問題是另一個。 從代碼,我認爲要保存這樣的頂點信息:

[X1,Y1,Z1,...][X1,Y1,Z1,W1,...]

你的循環會迭代這個數組中的8個步驟,因爲i+=8;。 因此,至少每個第二個頂點將在您的腳本中被跳過。

+0

I updated該問題並回復了您對頂點數據格式的原始評論 – kevzettler

+0

備案。我必須使用'.from'方法來轉換數據'const vertData = Float32Array.from(getVertDataUint8());'當寫入磁盤時,我必須使用'process.stdout.write(Buffer.from(vertData。緩衝液));' – kevzettler