Estou tentando implementar uma cena do oceano com C ++ e DirectX11. Atualmente, tenho uma grade projetada, ondas de Gerstner e um sombreamento básico. Meu problema é que, quando eu aponto minha câmera horizontalmente, para que eu possa ver o horizonte da água, à distância, a grade projetada se torna insuficiente, mesmo com altos números de vértices. Essas capturas de tela ilustram o problema:
Sei que a causa do problema está no conceito da grade projetada (a grade é detalhada perto da câmera, muito longe dela), mas deve haver uma prática recomendada para resolver isso.
Alguma ideia?
Você pode ser realista e em tempo real. o segredo é mudar a representação sempre que as informações estiverem na escala de Shannon-Nyquist (ou seja, grade): da geometria aos mapas normais e aos modelos de sombreamento. Este documento foi feito para você: http://maverick.inria.fr/Publications/2010/BNH10/index.php (veja também os vídeos do Yoube)
fonte
Alguns softwares como o Maya resolvem isso usando um polar (ou de fato cartesiano que fica polar à distância) da mesma maneira que a grade centralizada na posição da câmera. Essa configuração adiciona mais detalhes onde é mais importante. Depois, eles contam com o processamento normal dos shaders em outros intervalos. Há espaço para o curso improvemenet. Você modifica um pouco essa abordagem e tem qualquer outra forma que aumente a densidade da malha em direção à câmera. A vantagem disso é que você pode esticar o efeito até o horizonte sem se preocupar com a costura.
O truque para não deixar o deslocado desordenado nesse caso é que você reduz gradualmente o deslocamento à medida que se afasta. Você então usa a modificação normal no sombreador de pixels à medida que avança. É mais fácil filtrar do que ter que filtrar uma borda de shiluette precisa. Além disso, se você pode ver tão longe, então seus votos provavelmente são suficientemente planos de qualquer maneira.
fonte
A técnica mencionada por Benedikt é explicada na Seção 2.4.1 desta tese.
http://fileadmin.cs.lth.se/graphics/theses/projects/projgrid/projgrid-lq.pdf
A implementação disso deve resolver seu problema.
fonte