Red de conocimiento informático - Problemas con los teléfonos móviles - Unity Shader: conceptos básicos y aplicaciones del mapa de profundidad

Unity Shader: conceptos básicos y aplicaciones del mapa de profundidad

El mapa de profundidad almacena un rango de valores de profundidad de distribución no lineal, que provienen de las coordenadas NDC.

En el renderizado diferido, el valor de profundidad se ha renderizado en el búfer G de forma predeterminada; en el renderizado directo, debe aplicarlo para que Unity pueda usar el reemplazo de sombreador detrás de escena para establecer RenderType en Opaque y la cola de renderizado a menos de o igual a 2500 y el valor de profundidad del objeto con ShadowCaster Pass se renderiza en el mapa de profundidad.

Paso uno: Establecer Camera.main. DepthTextureMode = DepthTextureMode.Depth en C#

Puede ver el mensaje debajo del componente Cámara de la cámara principal:

Esto muestra que la cámara principal renderiza el mapa de profundidad

Paso 2: declara _CameraDepthTexture en el Shader

Paso 3: accede al mapa de profundidad

Utiliza la superposición pantalla Usando el valor uv y la profundidad en el mapa de profundidad, podemos reconstruir las coordenadas del objeto en el espacio mundial.

Hay dos métodos principales:

Primero, pase la matriz inversa VP actual en el script C#:

Luego, primero cree las coordenadas NDC en el Shader:

Utilice la matriz inversa VP actual para convertir las coordenadas NDC al espacio mundial:

El uso específico se puede ver en el ejemplo de MotionBlur a continuación.

En primer lugar, debe saber que el posproceso en realidad genera un quad que cubre la pantalla, por lo que las cuatro esquinas de la pantalla corresponden a las cuatro esquinas del frustum de visualización de la cámara.

El primer paso es calcular los vectores desde la cámara hasta las cuatro esquinas:

Supongamos que hay un punto verde en la línea donde se encuentra toTopLeft, y usando triángulos similares, se puede obtener:

La profundidad se puede obtener en el Shader, por lo que solo necesitamos pasar a TopLeft / cerca del Shader para calcular toGreen:

Determinar el vector del vértice correspondiente en Vértice:

Puedes ver que la relación entre el valor uv y el valor del índice correspondiente es exactamente binaria, por lo que se puede calcular de la siguiente manera:

Te sorprenderá que esto pueda Solo encuentra los puntos en las cuatro esquinas, pero el vértice es. Hay algo llamado interpolación en el proceso de fragmentación. Esta interpolación puede encontrar el vector donde se encuentra cada píxel.

Luego podemos encontrar las coordenadas mundiales en el fragmento:

El uso específico se puede encontrar en el ejemplo del efecto de niebla vertical a continuación.

Simplemente genere el valor de profundidad del rango, de la siguiente manera:

La idea es determinar si el valor de profundidad del objeto actual y el valor de profundidad correspondiente en el mapa de profundidad están dentro un cierto rango y, de ser así, determinar la intersección.

Primero acceda al valor de profundidad del objeto actual:

Luego acceda al mapa de profundidad.

Dado que no es un posproceso en este momento, debe utilizar el muestreo de textura proyectada para acceder al mapa de profundidad:

El último paso es realizar un juicio de intersección:

Sobre la base Del efecto de resaltado de intersección, agregue la mitad de la transparencia y el resaltado de bordes puede crear un efecto de campo de energía simple:

La idea es hacer que la concentración de niebla aumente a medida que aumenta el valor de profundidad, y luego ajustar el color de la imagen original y Interpolación de color de niebla:

La idea es similar al efecto de resaltado de intersección, excepto que se trata de un posproceso. Personalice un valor cambiante _CurValue y realice una interpolación de color basada en la diferencia entre _CurValue y el valor de profundidad:

Utilice el segundo método de reconstrucción de las coordenadas del espacio mundial mencionado anteriormente para obtener las coordenadas del espacio mundial y determine si el valor Y de la coordenada está por debajo de un umbral determinado; de ser así, mezcle el color de la imagen original y el color del agua:

Utilice el segundo método de reconstrucción de las coordenadas del espacio mundial mencionado anteriormente para obtener el coordenadas del espacio mundial, dejemos que la concentración de niebla cambie con el valor Y:

La idea es tomar las cuatro esquinas cercanas al píxel actual, calcular la diferencia en los valores de profundidad de las dos esquinas opuestas y multiplica los dos valores de diferencia para obtenernos Determinar el valor del borde.

Primero, obtenemos las 4 esquinas:

Luego obtenemos los valores de profundidad de estas 4 esquinas:

Finalmente, obtenemos el juicio de borde basado en la diferencia diagonal Valor:

El desenfoque de movimiento se utiliza principalmente en juegos de carreras para reflejar la sensación de velocidad. El desenfoque de movimiento introducido aquí sólo se puede utilizar en situaciones en las que los objetos circundantes están estacionarios y la cámara se está moviendo.

La idea es utilizar el método de reconstrucción de coordenadas mundiales mencionado anteriormente para obtener las coordenadas mundiales. Dado que las coordenadas mundiales no se mueven durante el movimiento de la cámara, las coordenadas espaciales mundiales se pueden transferir antes del movimiento de la cámara. y el sistema de coordenadas después del movimiento, obteniendo así dos coordenadas NDC. Usando estas dos coordenadas NDC, se puede obtener la trayectoria del movimiento del píxel y se pueden realizar múltiples muestreos en la trayectoria para desenfocar.

Primero, obtenga las coordenadas mundiales (se utiliza el primer método de reconstrucción mencionado aquí):

Luego calcule las coordenadas NDC antes y después de la operación:

Finalmente Se trata de desenfocar múltiples muestras en la trayectoria:

La profundidad de campo es un efecto donde el enfoque es claro y otros lugares están borrosos. Es muy común en fotografía.

La idea es renderizar primero una imagen borrosa y luego encontrar la profundidad correspondiente al punto de enfoque en el mapa de profundidad. Utilice la imagen original cerca de la profundidad y gradiente a la imagen borrosa en otros lugares.

El primer paso es usar SimpleBlur Shader para renderizar una imagen borrosa. Aquí simplemente tomo una muestra de 9 puntos cerca del píxel actual y lo promedio. Puedes elegir un método de desenfoque mejor:

. El segundo paso es pasar la imagen borrosa al Shader DepthOfField:

El tercer paso es mezclar el color de la imagen original y el color de la imagen borrosa según el enfoque en el Shader DepthOfField:

/KaimaChen /Unity-Shader-Demo/tree/master/UnityShaderProject

Unity Docs: textura de profundidad de la cámara

Unity Docs: diferencias de representación específicas de la plataforma

Figura de profundidad mágica: efectos complejos, principios sencillos

EFECTOS ESPECIALES CON PROFUNDIDAD

GPU Gems - Capítulo 27. Desenfoque de movimiento como efecto de posprocesamiento

《 Introducción a Unity Shader"

"Explicación práctica detallada del desarrollo de Unity 3D ShaderLab"