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.
Respuestas:
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.
fuente