Detalhe do horizonte de água da grade projetada

13

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:

superfície de água sombreada

superfície da água em estrutura de arame

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?

Gábor Szalóki
fonte

Respostas:

7

Acredito que uma solução comum é dividir a transformação de câmera usada para projetar a grade da transformação de câmera usada para renderizar a grade. Em perspectivas próximas de cima para baixo, as duas câmeras coincidem, mas quando a câmera de visualização se aproxima de uma perspectiva horizontal, a câmera de projeção se desvia e tenta manter uma inclinação mínima, ou seja, paira em algum lugar acima da câmera de visão e olha levemente para baixo.

A parte complicada é garantir que o campo de visão da câmera de projeção sempre cubra a região da cena vista da câmera de renderização. Não tenho um recurso em mãos que detalha como calcular as transformações apropriadas, e pode ser entediante derivar manualmente.

Uma solução diferente é pegar a caixa de ferramentas de processamento de sinal: os artefatos vistos na sua imagem são essencialmente aliases, causados ​​pela amostragem insuficiente do campo de altura da onda pela grade projetada. Portanto, uma solução é filtrar o campo de altura adequadamente, dependendo da área projetada de uma célula da grade. Acredito que isso seja usado na renderização offline de oceanos e, essencialmente, garante que as ondas no horizonte fiquem planas. No entanto, não tenho certeza de quão viável isso é na renderização em tempo real, pois você precisaria de filtragem anisotrópica de alta qualidade para tornar essa abordagem razoável.

Benedikt Bitterli
fonte
Obrigado pelo conselho, eu escolhi a solução preguiçosa por enquanto. Uso uma função no sombreador de vértice que determina a atenuação da onda à distância da câmera.
Gábor Szalóki 5/11
6

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)

Fabrice NEYRET
fonte
3

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.

joojaa
fonte