2012-01-28 9 views
9

¿Es posible que en el escritorio GLSL pase una matriz de flotantes de tamaño fijo al sombreado de vértices como atributo? Si es así, ¿cómo?Cuadrícula de tamaño fijo de GLSL por vértice

Quiero tener por pesos de vértices para la animación de personajes así que me gustaría tener algo como lo siguiente en mi vertex shader:

attribute float weights[25]; 

¿cómo iba a llenar la matriz de atributos del programa & OpenGL mi C++? He visto en otro question que podría obtener la ubicación de atributo del atributo de matriz y luego simplemente agregar el índice a esa ubicación. ¿Podría alguien dar un ejemplo sobre eso para mi matriz bastante grande?

Gracias.

Respuesta

16

Comencemos con lo que usted solicitó.

En prácticamente ningún hardware que existe actualmente attribute float weights[25]; compilar. Mientras que los sombreadores pueden tener matrices de atributos, cada índice de matriz representa un nuevo índice de atributo. Y en todo el hardware existe actualmente, la cantidad máxima de índices de atributos es ... 16. Necesitarías 25, y eso es solo para los pesos.

Ahora, puede mitigar esto fácilmente recordando que puede usar los atributos vec4. Por lo tanto, almacena cada cuatro elementos de matriz en un solo atributo. Su matriz sería attribute vec4 weights[7]; que es factible. Su lógica de búsqueda de peso tendrá que cambiar, por supuesto.

Aún así, no parece estar comprendiendo las ramificaciones de lo que esto realmente significaría para sus datos de vértice. Cada atributo representa un componente de los datos de un vértice. Cada vértice de una llamada de renderizado tendrá la misma cantidad de datos; el contenido de esos datos será diferente, pero no cuántos datos.

Para hacer lo que está sugiriendo, cada vértice en su malla necesitaría 25 flotadores que describan el peso. Incluso si esto se almacenó como bytes sin firmar normalizados, eso sigue siendo un valor de 25 bytes adicionales de datos como mínimo. Eso es mucho. Especialmente teniendo en cuenta que para la mayoría de los vértices vastos, la mayoría de estos valores serán 0. Incluso en el peor de los casos, estaría viendo tal vez 6-7 huesos que afectan a un solo vértice.

La forma en que se aplica el desollado en vertex shaders es limitar el número de huesos que afecta a un solo vértice a cuatro. De esta forma, no usa una matriz de atributos; solo usa un atributo vec4 para los pesos. Por supuesto, ahora también necesita decir qué hueso está asociado con qué peso. Entonces tiene un segundo atributo vec4 que especifica el índice óseo para ese peso.

Esto logra un buen equilibrio. Solo toma 2 atributos adicionales (que pueden ser bytes sin firmar en términos de tamaño). Y para la gran mayoría de los vértices, nunca lo notarás, porque la mayoría de los vértices solo están influenciados por 1-3 huesos. Algunos usan 4 y menos aún usan 5+. En esos casos, simplemente corta los pesos más bajos y vuelve a calcular los pesos de los demás proporcionalmente.

+2

Muchas gracias. ¡Respondiste a todas mis preguntas y aún más! ¡Espero que esto mejore en gran medida el rendimiento! Gracias de nuevo. – Nicholas

11

Nicol Bolas ya le dio una respuesta sobre cómo reestructurar su tarea. Debería hacerlo, porque procesar 25 flotantes para un vértice, probablemente a través de una multiplicación de cuaternión desperdiciará una buena potencia de procesamiento de la GPU; la mayoría de los atributos para un vértice se traducirán cerca de una transformación de identidad de todos modos.

Sin embargo, por razones académicas, les voy a decir cómo pasar 25 flotadores por vértice. La clave no es usar atributos para esto, sino buscar los datos de un búfer, una textura. La etapa de sombreado de vértice GLSL tiene la variable incorporada gl_VertexID, que pasa el índice del vértice procesado actualmente. Con OpenGL reciente también puede acceder a texturas del sombreador de vértices. Entonces tiene una textura de tamaño vertex_count × 25 con los valores. En el vertex shader puede acceder a ellos mediante la función texelFetch, es decir texelFetch(param_buffer, vec2(gl_VertexID, 3));

Si se utiliza en animación del esqueleto de este sistema se refiere a menudo como la textura desollar. Sin embargo, debe usarse con moderación, ya que es un cerdo de rendimiento real. Pero a veces no puedes evitarlo, por ejemplo cuando implementas un sistema de animación facial donde tienes que pesar todos los vértices a 26 músculos, si deseas simular con precisión un rostro humano.

+0

¡Muy interesante! Lo tendré en cuenta para el trabajo futuro. – Nicholas

Cuestiones relacionadas