Manipulación de malla en GPU vs CPU

9

Solo un poco curioso: ¿dónde realiza manipulaciones de malla, en la CPU o en el sombreador? He estado haciendo todo en la CPU y un amigo sugirió mover las cosas al lado de la GPU.

Si está haciendo cosas como animaciones óseas ... en la GPU, ¿cómo recupera la malla? (ya que estoy haciendo detección de colisión ...)

AnonAnon
fuente

Respuestas:

13

Esto ocurre comúnmente en la GPU, pero hay compensaciones para ambos y depende de usted decidir cuál funcionará mejor para usted.

Hacer la manipulación en la GPU significa que solo necesita enviar los datos de malla una vez, luego puede enviar las transformaciones de la matriz para deformarla. Esto es genial porque reduce en gran medida el ancho de banda requerido entre CPU-> GPU. También significa que puede cargar solo una copia de la malla en la GPU y aplicar transformaciones para muchas instancias diferentes de la malla. Sin embargo, es más difícil tener colisiones de "precisión de malla". Dado que las transformaciones se realizan en la GPU, no las tiene disponibles para probar en la CPU.

Hacer la manipulación en la CPU significa que tiene acceso a la malla transformada. Puede acceder a todo lo que necesita saber al respecto. Sin embargo, significa que debe cargar toda la malla en la GPU cada fotograma. También significa que debe cargar una malla transformada para cada instancia de esa malla. En resumen, aquí hay una lista exhaustiva de pros y contras.

  • Pros para GPU

    • Sube los datos de malla una vez
    • Transfórmalo para múltiples instancias
    • Solo es necesario enviar las transformaciones matriciales
    • La GPU es muy buena para paralelizar este tipo de cosas.
  • Contras para GPU

    • Las mallas transformadas no están disponibles para probar en la CPU
  • Pros para CPU

    • Las mallas transformadas están disponibles para pruebas de colisión y cualquier otra cosa necesaria.
  • Contras para CPU

    • Necesita cargar toda la malla transformada en cada cuadro
    • Necesita cargar una malla completa para cada instancia de la malla

Sin embargo, hay formas de evitar los inconvenientes de la GPU.

  • No tenga colisiones precisas de malla . Use algo "lo suficientemente cerca" como un cuadro delimitador para toda la malla o tenga cuadros delimitadores para cada hueso de la malla. Lo siguiente se utiliza en las transformaciones de GPU para la malla, y en las transformaciones de la CPU para cajas de delimitación de eje alineadas que representan la malla. Puede obtener límites aún más precisos utilizando no AABB.

huesos de duende

  • Transforme una copia de la malla en la CPU si y solo si se necesitan colisiones precisas de malla . Después de que la colisión de un cuadro delimitador se haya vuelto verdadera, transforme una malla para que coincida con las transformaciones en la GPU, luego verifique las colisiones para obtener datos de colisión más precisos.

En general, supongo que puede ver por qué es más común transformarse en la GPU

MichaelHouse
fuente
1
Solo por curiosidad, ¿es realmente práctico que las mallas se transformen en la CPU cuando se tiene en cuenta la complejidad de las mallas en los juegos modernos, la potencia y las capacidades multinúcleo de una CPU moderna y las otras tareas que debe realizar una CPU? Además, ¿la carga en la GPU es tan lenta que esta idea ni siquiera despegaría?
R4D4
Dependería del juego, pero generalmente no es práctico para juegos con una complejidad moderada. Cuando hay una opción tan fácil de hacer las transformaciones en la GPU, es difícil encontrar una razón para justificar los requisitos de recursos adicionales para hacer las transformaciones en la CPU. El problema es más con el envío de la malla transformada a la GPU en cada cuadro, que se vuelve costoso rápidamente. Como suele ser el caso con el software, depende del desarrollador tomar las decisiones entre complejidad y rendimiento.
MichaelHouse