Uint8array
(3d x、y、z座標のリスト)にデータがあります。私はいくつかの浮動小数点演算を実行する必要があります。この3次元ベクトル上で(行列回転変換乗算)を行う。私は計算のためにhttp://glmatrix.net/ライブラリを使用しています。Javascript CPU上でGLSL浮動小数点演算を再現する方法Uint8array
データは、頂点データがこれまで8 [x,y,z,w,r,g,b,a]
のセットでフォーマットされてUint8Array
としてそれをパッケージ化し、サードパーティのAPIから来て、私はこのUint8array
を渡して、GPU上でこの操作を実行されていると回転行列をGLSLに変換します。私はオフラインで実行されるCPUベースのスクリプトに操作を移しています。
更新もう1つの式です。オフラインスクリプトは、最終バッファをstdoutに、最終的にはUNIXの>
オペレータを使用してファイルに書き込むnode.js CLIスクリプトです。私は最終的なアプリケーションでこれをロードし、arrayBuffer
をtypedArray
コンストラクタでラップします。
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に値を再割り当てすると、特に負の値がintとしてキャストされていることに気付きました。例-10
〜= 246
:私はFloat32Array
コンストラクタでそれをラップし、Float32Array.from
を使用してFloat32Array
にUint8Array
を変換しようとしたが、作るようです
var u = new Uint8Array(1)
undefined
u[0] = -10
-10
u[0]
246
同じ結果。
まず、頂点データに 'Float32Array'を使用してください。なぜあなたは 'i + = 8; 'を使っていますか?あなたのUInt8Arrayは、 '[X1、Y1、Z1、...]'または '[X1、Y1、Z1、W1、...]'のようになります。 1秒おきに – Bellian
@Bellian私は、頂点データが簡単には更新できないサードパーティソースから来ると付け加えるべきです。 'Uint8Array'を' Float32Array'に変換することはできますか?さらに、8つの属性[x、y、z、w、r、g、b、a]の頂点フォーマットは実際には8のステップで反復するように設定されます。 – kevzettler