Perfil de superficie superior de agua 2D

9

Estoy tratando de crear el efecto del grosor de la superficie del agua con un sombreador de fragmentos de vértice.

Estoy en un entorno de juego en 3D, pero es una vista de desplazamiento, así que una vista "2D". Aquí hay un buen tutorial para crear dicho efecto en 2D real usando fragment shader.
Pero esto no se puede usar en mi caso, creo. Por el momento solo tengo un avión donde aplico refracción.

refracción

Y quiero aplicar el efecto de espesor de agua. Pero no sé cómo hacerlo.
No estoy tratando de crear alguna deformación / desplazamiento del agua usando vértices por el momento, este no es el punto.

No sé si es posible con un quad simple, tal vez debería usar un objeto como este.

sistema

Aquí hay unos ejemplos.

1 2 4 4 Rayman

No tengo idea de cómo crear este efecto.

Muchas gracias !

[ EDITAR ] Se agregó el efecto de agua Rayman para tener una mejor referencia del efecto.

Estera
fuente
¿Cómo estás haciendo tu efecto de agua actualmente? Si la primera captura de pantalla en la publicación es tuya, parece que estás dibujando un quad 2D sobre la escena, con un sombreador que lo distorsiona. Si eso es correcto, ¿por qué no puede seguir las instrucciones del tutorial, que también se basa en el uso de una textura 2D distorsionada?
Nathan Reed
Tengo un quad 3D con un sombreador de fragmentos de vértice que perturba el fondo (el fondo es capturado por la funcionalidad de Unity GrabPass). No creo que usar una textura 2D sea una buena idea, estaba pensando en algo más genérico con parámetros personalizables, pero parece que no hay otra forma ... y sería más lento, ¿no?
MaT

Respuestas:

1

Tener un valor en el sombreador que especifique la humedad. Menor que 0 significa aire, mayor que 1 significa agua, y en el medio significa menisco.

Aquí hay un pseudocó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
}

Esto es lo más simple que puedo hacer. Si fuera yo, haría algo un poco más complicado para antialias del menisco y aplicaría más refracción allí o algo así, pero no puedo decirte qué porque tomaría iteraciones estéticas. Además, teñiría y difuminaría la muestra de agua. Pero te dejo todo eso a ti.

DaleyPaley
fuente
Si, es una buena idea ! Estoy totalmente de acuerdo con el desenfoque y el tinte. También estoy agregando un gradiente de profundidad (Y) (quizás otro gradiente de profundidad (Z)). También debería agregar un efecto de refracción diferente en la zona del menisco, pero por el momento estoy tratando de tener un efecto dominó como en Rayman. Pero no se como. Tal vez debería usar diferentes texturas para que el menisco tenga este efecto duplicado. No sé si sabes a qué me refiero.
MaT