ボーン/スキニングを使ったアニメーションを練習しています。頂点ごとに1つのマトリックスをシェーダーに送信しようとしています。私はこれら2つのアプローチを考えることができます。
方法1
このように各骨マトリックスに1つの均一なハンドルがあります
u_Bone0 = GLES20.glGetUniformLocation(mProgram, "u_Bone[0]");
u_Bone1 = GLES20.glGetUniformLocation(mProgram, "u_Bone[1]");
そして、onDraw
私はそれらのそれぞれをシェーダーに送ります:
GLES20.glUniformMatrix4fv(u_Bone0, 1, false, matrix0, 0);
マトリックスが多数ある場合、これは明らかに良い方法ではありません。リファクタリングするコードがたくさんあるのでまだ試していない私の2番目のアイデア
方法2
を使用しglUniformMatrix4fv
てそれらを一度にすべて送信することです(20個の行列があると仮定します)
GLES20.glUniformMatrix4fv(u_Bones, 20, false, matrices, 0);
はどこmatrices
ですかfloat[16 * 20]
。ただし、各ボーンのマトリックスを変更するのは少し面倒になります。たとえば、3番目の行列を取得する場合、次の行に沿って何かが必要です。
float[] _3rd = Arrays.copy(matrices, 3*16, 4*16);
値を保存すると、さらに煩わしくなります。
私は現在方法1を使用していますが、あまりスマートに見えません...
複数のマトリックスをOpenGL ES 2シェーダーに送信する最良の方法は何ですか?
LE:私はAndroidを使用しているので、Javaソリューションを探しています。