¿Cómo puedo incorporar la física en un mundo generado por procedimientos desde un sombreador de geometría?

10

Esencialmente quiero eliminar la necesidad de generar ruido coherente de la CPU a la GPU. A partir de ahí, también quiero generar el terreno para un mundo tridimensional utilizando este ruido como densidades en puntos voxel. Después de esto, quiero tomar esas densidades y poligonalizarlas (generar vértices) representando el terreno del mundo.

Esto está bien y todo. Pero también quiero deformar dinámicamente el mundo en tiempo real. Una vez que llego a este punto, tengo un problema al intentar que los vértices vuelvan a la CPU para hacer cosas como la detección de colisiones y todos los cálculos del juego que quiero involucrar en la CPU y no en la GPU.

Entonces, la pregunta es: ¿cómo puedo devolver un subconjunto de los vértices a la CPU para hacer frente a colisiones, entre otras cosas?

Y una pregunta más: ¿hay una manera fácil de tomar un conjunto de vértices y generar índices a partir de ellos en la GPU?

Estoy confundido y también sobre qué tipo de sombreadores debería usar para estas cosas diferentes. Escuché de personas que usan un sombreador de píxeles para reunir densidades y luego usan un sombreador de geometría para tratar la generación del terreno a partir de los vértices y luego incorporan de alguna manera un sombreador de vértices para hacer las deformaciones dinámicas.

Estoy usando C # 4.0, .NET 4.0 y XNA Game Studio 4.0.

Michael J. Gray
fuente
1
Dices que estás usando un sombreador de geometría en el título, pero también dices que estás usando XNA4.0, por lo que sé, XNA 4.0 requiere DirectX 10 (para que sea más fácil de desarrollar para una plataforma más uniforme) pero solo admite funciones SM3.0, por lo que no hay sombreador de geometría. forums.create.msdn.com/forums/p/31369/178924.aspx
Roy T.
Y ahora ya no usaré XNA ni reelaboraré mi diseño. Gracias por señalar eso. Lo había estado investigando y no me di cuenta de esta limitación (no SM 4). Supongo que la pregunta aún permanece, sin la consideración de XNA. Entonces, desde la perspectiva de DirectX, ¿hay alguna manera de hacer lo que quiero? ¿O tal vez con un sombreador de vértices en XNA?
1
Bueno, XNA sigue siendo válido para usar, a menos que tenga un caso de prueba probado donde las deformaciones y la generación sean demasiado lentas. Y que ha demostrado en otro caso de prueba que la GPU se deforma + generación y luego devolver datos a la CPU es más rápido :)
Roy T.
En efecto. Descubrimos que usar XNA y mantener todo en la CPU nos dio aproximadamente 1 millón de vértices en aproximadamente tres minutos en un Core i7 con 8 núcleos y 8 hilos paralelos a múltiples secciones de terreno por hilo. Al intentar hacer eso en tiempo real y, con suerte, renderizar el terreno antes de que el jugador pudiera verlo, logramos unos 20 fotogramas por segundo. Entonces, un caso de prueba definitivamente está en orden con cada uno de los métodos.
Michael J. Gray

Respuestas:

3

Dado que XNA no admite sombreadores de geometría, lo responderé como si estuviera usando DX 10. Básicamente tiene tres opciones.

Sombreadores de geometría Los sombreadores de geometría pueden modificar y agregar vértices a un búfer de vértices. Podrías leer esto nuevamente en la CPU. No lo he investigado, pero definitivamente es posible.

Simplemente use la CPU. En segundo lugar, ¿por qué no la calcula en la CPU? El hecho de que se ejecute en la GPU en sombreadores sugiere que su algoritmo de deformación es localizable, es decir, puede generar fácilmente solo las partes relevantes para su verificación de colisión.

Por ejemplo, hice un juego de navegación hace un tiempo. El océano utilizó los sombreadores de vértice y geometría para deformar el agua con olas. Utilicé el mismo algoritmo calculado en la CPU en solo unos pocos puntos debajo del bote para el movimiento del bote en las olas. Estoy seguro de que podría hacer algo similar para su mapa de vóxel.

Sombreadores de píxeles La última opción, también mencionaste esto en tu pregunta: genera las densidades en el sombreador de píxeles y escríbelo en una textura 3D. Puede acceder a esto desde la CPU y los sombreadores de manera bastante inofensiva. El sombreador de píxeles es perfecto para esta tarea, pero este método tiene mucha sobrecarga. Representar la textura del volumen, así como muestrear desde el vértice y el geo. sombreadores y tener que leer la textura en la CPU.

No sé los detalles de su proyecto, pero siempre usaría la CPU para esto. Por supuesto, calcule también las densidades en los sombreadores, pero utilice la tarjeta gráfica para renderizar.

Hannesh
fuente
El principal problema que tuvimos fue la barrera GPU-CPU. En el sentido de, una vez que generamos y renderizamos el terreno en la GPU, ¿cómo calculamos cómo se ve el terreno en el lado de la CPU para hacer colisiones y otras cosas? Supongo que su pensamiento sobre mantenerlo en la CPU es válido. Quiero decir, probablemente podamos optimizar un poco nuestro algoritmo y generar menos terreno. Marcaré su respuesta como la solución en un día o dos para ver si alguien más tiene una respuesta. Gracias por provocar algunas ideas alternativas.
Michael J. Gray
Con su ejemplo de navegación, no podría conectar fácilmente el resultado de la forma de onda de un barco que salpica las olas a la GPU, ¿verdad?
deceleratedcaviar
1
Puede mantener el mismo sistema de renderizado, es decir, generar y renderizar el terreno en la GPU, pero reflejar las partes del terreno que necesita en la CPU. Usando el mismo algoritmo y los mismos parámetros, obtendría el mismo terreno en la CPU que ve en la pantalla.
Hannesh
@Daniel No con el algoritmo de onda directamente, pero es posible deformar la malla de agua de acuerdo con la estela del barco con una textura de desplazamiento que cada barco "arrastra" detrás de él.
Hannesh
Ah! Esa es una gran idea :). Pero probablemente no sea compatible con múltiples embarcaciones muy bien.
deceleratedcaviar