WebGL でハードウェア スキニングを取得しようとしていますが、すべてのマトリックスを含むテクスチャで動作するようには見えません。次のようなフロート テクスチャをフィードしています。
var buffer = new Float32Array(...);
...
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, buffer.byteLength / 16, 1, 0, gl.RGBA, gl.FLOAT, buffer);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
テクスチャに加えて、テクスチャの合計サイズと比較した各マトリックスとベクトルの相対的なサイズも送信します。WebGL にはテクセル フェッチがないため、これはボーン インデックスをテクスチャ座標にマッピングするために使用されます。たとえば、40 個のボーンがある場合、各マトリックスは 1/40 で、各ベクトルは 1/40/4 です。
関連する頂点シェーダー パーツは次のとおりです。
...
uniform sampler2D u_bone_map;
uniform float u_matrix_fraction;
uniform float u_vector_fraction;
...
mat4 boneMatrix(float bone) {
return mat4(texture2D(u_bone_map, vec2(u_matrix_fraction * bone, 0)),
texture2D(u_bone_map, vec2(u_matrix_fraction * bone + u_vector_fraction, 0)),
texture2D(u_bone_map, vec2(u_matrix_fraction * bone + u_vector_fraction * 2.0, 0)),
texture2D(u_bone_map, vec2(u_matrix_fraction * bone + u_vector_fraction * 3.0, 0)));
}
...
これは機能しません。どのように変更しようとしても、画面にジャンクが表示されます。これは、texelFetch (および実際の均一なバッファー) などの適切な機能がなくても実現可能ですか?
マトリックスの均一な配列で同じコードを実行していますが、現在のセットアップでは (最大の均一なベクトルの制限のため) 62 個を超えるボーンをサポートできず、一部の 3D モデルには十分ではありません。