Como hacer un efecto de agua de dibujos animados

Como hacer un efecto de agua de dibujos animados

Este artículo de la referencia tutorial , añadir sus propias pequeñas experiencias.

En primer lugar, la diferencia entre la superficie y la profundidad de la escena se divide en dos valores extremos de cada superficial y agua profunda, superficial y agua profunda, y luego interpolado de acuerdo con la profundidad. La llamada de poca profundidad, y la distancia del objeto es por debajo de la superficie del agua es menor color, más ligero; así llamada agua profunda, es la distancia por debajo de la superficie del objeto y la superficie es grande, más oscuro.

Por lo tanto, la forma de obtener la profundidad de la escena que? motor de la unidad viene con ** ** _ CameraDepthTexture, pero esto se basa en las coordenadas de la pantalla de la textura, la forma de la muestra al valor correcto de shader de fragmentación ir? Vertex \ (V \) , primero UnityObjectToClipPos mediante la conversión a coordenadas homogéneas, esta vez \ (VX \) y \ (Vy \) rangos son \ ([- vw, vw] \) , entonces la transformación de visualización de acuerdo con:
\ [screen.x = (VX + VW * 0,5 * 0,5) * screen.width / VW \]

\ [Screen.y = (vy * 0,5 + vw * 0,5) * Screen.Height / vw \]

Encontramos que las coordenadas reales de la muestra es el \ ((screen.x / screen.width, screen.y / Screen.Height) \) . La unidad ofrece dos funciones integradas para ayudarnos a la muestra: ComputeScreenPos y tex2Dproj . ComputeScreenPos resultado de esta función se obtiene \ (((+ 0.5 * 0.5 * VW), (Vy * 0,5 + 0,5 * VW), VZ, VW) \ VX) , tex2Dproj re-muestra las coordenadas de la división perspectiva función será pasado toma de muestras.

Sin embargo, del valor de profundidad de la muestra a través de la profundidad después de la conversión proyección en perspectiva, ya no es lineal, necesitamos para restaurarlo al valor de profundidad original de ser utilizado. De hecho, esta es la transformada inversa de transformación de proyección de la naturaleza. La unidad también ofrece una función incorporada: LinearEyeDepth . Esta función se obtiene por la profundidad original, la profundidad del agua para hacer la diferencia original por el valor de diferencia de color puede ser una interpolación lineal. Dos puntos deben ser conscientes:

  1. La información de profundidad almacenados en la textura escena profundidad antes de emitir el agua, que no contiene la información de la profundidad del agua, además, en el caso de-z principios abierta, siempre y cuando la ejecución de código de fragmentación agua es el valor de profundidad de agua valor de profundidad de la escena es más pequeña
  2. El valor de la profundidad del agua es el original ComputeScreenPos devueltos por esta función \ (W \) . Antes de realizar la división perspectiva, el valor de profundidad original se ha almacenado en el vértice \ (W \) componente

En resumen, el código de shader de lo anterior para lograr lo siguiente:

float existDepth01 = tex2Dproj(_CameraDepthTexture, i.screenPos).r;
float existDepth = LinearEyeDepth(existDepth01);
float difference = existDepth - i.screenPos.w;
float difference01 = saturate(difference / _MaxDistanceCutOff);

float4 waterColor = lerp(_ShallowWaterColor, _DeepWaterColor, difference01);

efecto FIG.

El segundo paso, tenemos que añadir alguna información perturbación agua para lograr efecto dominó. El uso de un mapa de ruido, el muestreo directo convencional de color de color de superposición:

Se pueden encontrar, debido a la superposición de color directo, el color de la mayor parte de cepillo de la región demasiado brillante, y queremos que, de hecho, los colores brillantes siendo el mismo lugar, un lugar oscuro pintada del color de una onda, por lo que añadir un filtro de corte :

A continuación, queremos que una porción de borde cerca de la costa también tienen ondulación. Diferencia en la profundidad del agua cerca de la orilla y la escena es pequeña, puede tomar ventaja de esto los valores de corte más bajos para el ruido, por lo que el ruido también puede añadir una parte del borde de la superficie:

Además, una perturbación puede añadir textura, dos canales de uv textura muestreado compensados ​​ruido, para conseguir el efecto del flujo.

Ahora, el sentimiento general ha sido. La observación cuidadosa se puede encontrar, en el que el objeto se encuentra en contacto con la superficie del agua, ondulaciones deben ser punto más obvio, que es el contacto local con el objeto de reducir la necesidad de valor de corte adicional de ruido. En este caso, los datos de línea normal requeridos por la escena de procesar. El método de la diferencialmente línea de contacto con la superficie del objeto es relativamente grande, un método otra diferencia línea es relativamente pequeño. Fácil pensar en un producto escalar de dos vectores método para medir el grado de vectores de diferencia.

Debido a que la unidad viene con la textura normal limitado y preciso para considerar sus propias normales de textura mapa de representación de una escena. Adicional una nueva cámara, ajustando su profundidad, utilizando SetReplacementShader método, sustitución de cualquier otra escena de sombreado, se les permite dar forma línea escrita, para dar RT. Este método puede sustituir a todos por la misma etiqueta de sombreado, de modo que se presten con el shader especificado, por etiqueta diferente, entonces salte la representación, la Unidad aquí puede hacer referencia a la documentación oficial.

A continuación, se puede modificar el modo de etiqueta y la mezcla del sombreado para permitir que el agua se vuelva transparente. Al mismo tiempo, también esperamos poder ajustar el rizado de color. Con el fin de ser de color propia ondulación capaz y el color de la propia agua, en lugar de la adición de la fusión, se utiliza alfa-mezcla modelo, por lo ondulación propia mezcla de color a la superficie, a continuación, los resultados obtenidos de corte previamente usado se puede utilizar en alfa dispuesta en corrugado.

Por último, las ondulaciones en los bordes, pueden ser suavizadas con un smoothstep de corte.

En resumen, para lograr un simple efectos de agua de dibujos animados, divididas en los siguientes pasos:

  1. La diferencia entre la profundidad del agua de la escena, dividido en poco profundas y zonas más profundas;
  2. Uso de la mezcla mapa de ruido para el agua, al efecto de ondas de agua, superficie de borde atención, una gran diferencia en la profundidad del agua donde poco efecto dominó; un objeto en el centro de las diferencias normales de la superficie locales, un gran efecto de onda;
  3. Mediante el ajuste del modo de mezcla, ondulaciones se pueden proporcionar de modo que el color del agua se mezclan en sí a la superficie;
  4. Ondulación del agua de suavizado de bordes efecto puede ser smoothstep.

Supongo que te gusta

Origin www.cnblogs.com/back-to-the-past/p/12483905.html
Recomendado
Clasificación