Estou praticando animações usando ossos / esfola. Estou tentando enviar ao shader uma matriz por vértice. Eu posso pensar nessas duas abordagens.
Método 1
Eu tenho uma alça uniforme para cada matriz óssea como esta
u_Bone0 = GLES20.glGetUniformLocation(mProgram, "u_Bone[0]");
u_Bone1 = GLES20.glGetUniformLocation(mProgram, "u_Bone[1]");
e no onDraw
envio cada um deles ao sombreador:
GLES20.glUniformMatrix4fv(u_Bone0, 1, false, matrix0, 0);
Obviamente, isso não é uma boa abordagem se eu tiver um grande número de matrizes. Minha segunda ideia, que ainda não tentei, pois há muito código para refatorar
Método 2
É usar o glUniformMatrix4fv
para enviar todos de uma vez como (suponha que eu tenho 20 matrizes)
GLES20.glUniformMatrix4fv(u_Bones, 20, false, matrices, 0);
onde matrices
é float[16 * 20]
. Porém, modificar as matrizes de cada osso se torna um pouco entediante. Por exemplo, se eu quiser obter a 3ª matriz, preciso de algo ao longo das linhas de
float[] _3rd = Arrays.copy(matrices, 3*16, 4*16);
e salvar de volta os valores pode se tornar ainda mais irritante.
Estou usando o método 1 agora, mas não parece muito inteligente ...
Qual é a melhor maneira de enviar várias matrizes para um shader OpenGL ES 2?
LE: Estou usando o Android, então estou procurando uma solução Java.