我在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