我在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)
現在的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
轉換Uint8Array
爲Float32Array
,但它似乎產生相同的結果。
首先:請使用Float32Array作爲頂點數據。你爲什麼使用'i + = 8;'?你的UInt8Array應該看起來像這樣:'[X1,Y1,Z1,...]'或者[X1,Y1,Z1,W1,...],所以你至少要跳過'i + = 8'每第二個垂直。 – Bellian
@Bellian我應該補充一點,頂點數據來自不容易更新的第三方來源。我可以將'Uint8Array'轉換爲'Float32Array',此外,頂點格式實際上是8個屬性[x,y,z,w,r,g,b,a]的集合,因此可以以8爲單位進行迭代。 – kevzettler