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.
Respostas:
O envio de várias matrizes para o shader é simples:
Shader:
Programa:
A modificação das matrizes para cada osso não está relacionada à maneira como você as passa para o shader. Você pode simplificar as modificações se trabalhar com estruturas em vez de matriz de números.
fonte
Eu sugeriria usar um VBO. Preencha seu VBO com as matrizes e passe-as usando um atributo em vez de um uniforme. Dessa forma, o VBO distribuirá uma nova passagem de mat4 por vértice no shader.
Quando você vincula o VBO antes de desenhar (ou cria um VAO para esses estados):
Veja como passar um mat4 como um atributo: /programming/17355051/using-a-matrix-as-vertex-attribute-in-opengl3-core-profile
Espero que isto ajude
fonte
O método 1 pode ser expandido para usar matrizes para abstrair o número de matrizes no código: (assumindo java)
e então, quando você define as matrizes, pode fazer
fonte