No meu mecanismo, crio um terreno infinito com o uso do algoritmo de ruído Perlin calculado na CPU.
A criação do terreno é assim:
- Se a câmera estiver perto do patch descarregado, crie-o
- Calcule uma matriz de ruído de 513 x 513 com limites especificados
- Cálculo de normais, tangente, binormal, índices
- Passar dados para vbo
Prós:
- Só precisa ser renderizado quando necessário
- Fácil de fazer colisão
Vigarista
- 64 patches lentos de 513x513 são criados em 3,1s (um encadeamento). Para cada bloco ~ 20ms de criação de ruído, ~ 25ms de vértices, normais, tangente, bitangente, índices. Quando a câmera se move rapidamente, o usuário pode perceber o carregamento de peças.
- consumindo memória ???
Agora eu estava pensando em como acelerar isso, gerando terreno completamente na GPU. Mas há algumas dúvidas:
- Se os shaders executam todos os quadros, esse desperdício de energia não é computado para calcular o ruído repetidamente? Isso pode ser evitado escrevendo o resultado na textura RBGA e usado posteriormente no shader de vértice para deslocamento, mas aumenta o uso da memória. Por outro lado, se a criação for super rápida, apenas os blocos visíveis devem permanecer na memória. No entanto, a desanexação do buffer causa a sincronização gpu-cpu, o que pode tornar o aplicativo mais lento (estou certo?)
- Se o terreno é apenas uma grade plana deslocada pelo sombreador de vértices, o mesmo trabalho precisa ser feito na CPU para calcular a altura e o normal em um determinado ponto para colisão.
- Este é apenas um conceito, mas para acelerar tudo, eu estava pensando em projetar uma grade na janela de exibição, para que apenas uma quantidade mínima de vértices seja usada. Você acha que isso funcionaria?
Minha pergunta final é:
Qual a melhor / mais rápida / técnica amplamente usada para criar terrenos infinitos na GPU?