Perfil da superfície superior da água em 2D

9

Estou tentando criar o efeito da espessura da superfície da água com um shader de fragmento de vértice.

Estou em um ambiente de jogo em 3D, mas é uma visualização de rolagem, portanto, uma visualização "2D". Aqui está um bom tutorial para criar esse efeito em 2D real usando o shader de fragmentos.
Mas isso não pode ser usado no meu caso, eu acho. No momento, tenho apenas um avião em que aplico refração.

refração

E eu quero aplicar o efeito de espessura da água. Mas eu não sei como fazer isso.
Eu não estou tentando criar alguma deformação / deslocamento de água usando vértice no momento, este não é o ponto.

Não sei se é possível com um quad simples, talvez eu deva usar um objeto como este.

sistema

Aqui estão alguns exemplos.

1 1 2 4 rayman

Eu não tenho nenhuma idéia de como criar esse efeito.

Muito obrigado !

[ EDIT ] Adicionado efeito de água Rayman para ter uma melhor referência do efeito.

Esteira
fonte
Como você está fazendo o efeito da água atualmente? Se a primeira captura de tela da postagem for sua, parece que você está desenhando um quadrilátero 2D sobre a cena, com um sombreador que a distorce. Se estiver correto, por que você não pode seguir as instruções do tutorial, que também se baseia no uso de uma textura 2D distorcida?
Nathan Reed
Eu tenho um quad 3D com um shader de fragmento de vértice que distorce o plano de fundo (o plano de fundo é capturado pela funcionalidade do Unity GrabPass). Eu não acho que usar uma textura 2D seja uma boa idéia, eu estava pensando em algo mais genérico com parâmetros úteis, mas parece que não há outra maneira ... e seria mais lento, não?
MAT

Respostas:

1

Tenha um valor no shader que especifique a umidade. Menor que 0 significa ar, maior que 1 significa água e, no meio, menisco.

Aqui está algum pseudo-código:

vec2 uv2 = bigWaves(uv); // modify the texture coords to create a wavy water effect
float wetness = (uv2.y - 0.1) * 100;

if( wetness<0.0 )
{
    gl_Fragment = texture2D(screen_texture,uv); // is air - no refraction or effect
}
else if( wetness>1.0 )
{
    vec2 uv3 = smallWaves(uv2); // modify the texture coords to create a ripply water effect
    gl_Fragment = texture2D(screen_texture,uv3); // is water - with refraction
}
else
{
    gl_Fragment = vec4(1,1,1,1); // solid white meniscus
}

Este é o mais simples que posso fazer. Se fosse eu, eu faria algo um pouco mais complicado para antialias do menisco e aplicaria mais refração lá ou algo assim, mas não posso lhe dizer o quê, porque seriam necessárias iterações estéticas. Além disso, eu tingiria e borraria a amostra de água. Mas vou deixar tudo isso para você.

DaleyPaley
fonte
Sim, é uma boa ideia! Eu concordo totalmente com borrões e tonalidades. Também estou adicionando um gradiente de profundidade (Y) (talvez outro gradiente de profundidade (Z)). Também devo adicionar um efeito de refração diferente na zona do menisco, mas, no momento, estou tentando ter um efeito cascata, como em Rayman. Mas eu não sei como. Talvez eu deva usar texturas diferentes para o menisco para ter esse efeito duplicado. Não sei se você entende o que quero dizer.
MAT