頂点ごとに行列のインデクスを1つ持っておいて、100%のウェイトで座標変換する方式。とりあえず行列は2つまで。
実装
頂点シェーダー内で
| uniform mat4 uMMatrix[2]; // モデル行列配列 | 
とボーン用の行列の配列を用意して、js側でシェーダーの初期化時に
| shaderProgram.uMMatrix = [ | 
と取得しておく。
頂点ごとのアトリビュートとして行列インデクスを定義
| attribute float aBlendIndices; | 
する。js側からは
| shaderProgram.aBlendIndices = gl.getAttribLocation(shaderProgram, 'aBlendIndices'); | 
としてアトリビュートを取得しておく。 モデルの頂点バッファとして行列インデクスを
| var blendIndicesBuffer = gl.createBuffer(); | 
などとして作成する。
描画時は行列を計算して
| for (var i = 0; i < 2; ++i) { | 
としてシェーダーに渡す。
頂点シェーダーでブレンドインデクスと行列パレットから頂点座標を計算:
| gl_Position = uVPMatrix * uMMatrix[int(aBlendIndices)] * vec4(aVertexPosition, 1.0); | 
int() でキャストしないと配列アクセスでエラーが出る。
課題
- 行列の配列を渡す方法
- ブレンドウェイト
- 3x4行列またはクォータニオンを使う