タグ付けされた質問 「skinning」

1
AndroidでGPUスキニングを確実に実装するにはどうすればよいですか?
Androidでキャラクタースキニングを機能させようとしています。 アイデアはかなりバニラです:私にはスキニングマトリックスがあり、各頂点と共に、最大4つのマトリックスインデックスと4つの対応する重みを送信します。それらを頂点シェーダーで合計し、各頂点に適用します。 これは、ゲームのiOSバージョンの頂点シェーダーで行っていることです(法線は問題ありません)。 attribute vec4 in_pos; attribute vec4 in_normal; attribute vec2 in_texture_coords; attribute vec4 in_bone_index; attribute vec4 in_bone_weight; varying vec2 fs_texture_coords; uniform mat4 world_view_projection; uniform mat4 bones[@bind_matrix_count]; void main() { // Skinning vec4 transformed_pos = ((in_pos * bones[int(in_bone_index.x)]) * in_bone_weight.x) + ((in_pos * bones[int(in_bone_index.y)]) * in_bone_weight.y) + ((in_pos * bones[int(in_bone_index.z)]) …

3
複数の行列を頂点シェーダーに送信するにはどうすればよいですか?
ボーン/スキニングを使ったアニメーションを練習しています。頂点ごとに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ソリューションを探しています。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.