Essencialmente, quero remover a necessidade de gerar ruído coerente da CPU para a GPU. A partir daí, também quero gerar o terreno para um mundo tridimensional usando esse ruído como densidades nos pontos voxel. Depois disso, quero pegar essas densidades e poligonizá-las (gerar vértices), representando o terreno do mundo.
Tudo bem e tudo. Mas também quero deformar dinamicamente o mundo em tempo real. Quando chego a esse ponto, tenho um problema ao tentar obter os vértices de volta à CPU para fazer coisas como detecção de colisão e todos os cálculos de jogos que quero envolver na CPU e não na GPU.
Portanto, a pergunta é: como posso obter um subconjunto dos vértices de volta à CPU para lidar com colisões, entre outras coisas?
E mais uma pergunta: existe uma maneira fácil de pegar um conjunto de vértices e gerar índices a partir deles na GPU?
Estou confuso e com que tipos de shaders devo usar para essas coisas diferentes. Eu ouço pessoas usando um sombreador de pixel para coletar densidades e, em seguida, usando um sombreador de geometria para lidar com a geração de terreno a partir dos vértices e, de alguma forma, incorporando um sombreador de vértice para fazer as deformações dinâmicas.
Estou usando C # 4.0, .NET 4.0 e XNA Game Studio 4.0.
Respostas:
Como o XNA não suporta shaders de geometria, responderei como se você estivesse usando o DX 10. Você tem essencialmente três opções.
Shaders de geometria Os shaders de geometria podem realmente modificar e adicionar vértices a um buffer de vértice. Você pode ler isso de volta na CPU. Eu não olhei para isso, mas é definitivamente possível.
Basta usar a CPU Em segundo lugar, por que você simplesmente não calcula na CPU? O fato de ser executado na GPU em shaders sugere que seu algoritmo de deformação é localizável, ou seja, você pode facilmente gerar apenas as partes relevantes para a verificação de colisão.
Por exemplo, eu fiz um jogo de vela há um tempo atrás. O oceano usou os shaders de vértice e geometria para deformar a água com ondas. Usei o mesmo algoritmo calculado na CPU em apenas alguns pontos sob o barco para o movimento do barco nas ondas. Tenho certeza de que você poderia fazer algo semelhante ao seu mapa voxel.
Pixel shaders A última opção, você mencionou isso na sua pergunta também: gere as densidades no pixel shader e grave-o em uma textura 3D. Você pode acessar isso a partir da CPU e dos shaders de maneira bastante inofensiva. O pixel shader é perfeito para esta tarefa, mas esse método possui muita sobrecarga. Renderização da textura do volume, bem como amostragem de dentro no vértice e na região geográfica. shaders e ter que ler a textura na CPU.
Não sei as especificidades do seu projeto, mas sempre usaria a CPU para isso. Por todos os meios, calcule as densidades também nos shaders, mas continue usando a placa gráfica para renderização.
fonte