Observando sombras uniformes a partir de sombras en franjas
Reproducir "sombras con bandas" es realmente muy sencillo, e incluso podemos conseguir este fenómeno sin modificar ninguna de las configuraciones predeterminadas de Unity. Para hacer un experimento, cree un nuevo proyecto de Unity (2019), cree dos objetos quad y luego apílelos hacia arriba y hacia abajo. Establezca la altura del Quad superior (coordenada mundial del eje Y) en 0,05, la altura del Quad inferior. a 0, y ajuste la luz de dirección principal para mantener la dirección vertical, es decir, rotación: (90, 0, 0). Si todo está bien, puede que funcione. 0>.
Mantenemos la iluminación y la posición del plano sin cambios, y luego necesitamos ajustar dos parámetros importantes, llamados desplazamiento y desplazamiento normal. Unity expone estos dos parámetros en los parámetros de configuración del componente de luz con respecto a las sombras en el modo de canalización de renderizado estándar. El modo URP se puede encontrar en la barra de configuración de la función de renderizado. En resumen, busque y establezca el sesgo = 0 y el sesgo normal = 0, veamos qué cambios suceden:
Bajo inventario simple, bajo iluminación directa con cierta inclinación, veremos la diferencia entre los dos. paneles que están muy cerca uno del otro, si observa la proyección del panel superior al panel inferior, encontrará la "sombra de cinta" sobre esta base, restablecemos los parámetros de polarización y polarización normal a cero, y la proyección; entre los parches Las sombras vuelven a la normalidad, pero aparecen "sombras en tiras" en las áreas originales del parche que no tenían sombras.
En cualquier caso, antes de interpretar, debemos dejar claro que este fenómeno es causado por el procesamiento de efectos de sombras de Unity, porque solo ajustamos dos parámetros que controlan la visualización de sombras. En cuanto a cómo Unity o un motor de juego general genera efectos de proyección de objetos, considerando que hay una gran cantidad de información sobre contenido relacionado en Internet, no entraré en detalles aquí. En resumen, podemos organizar la lógica de renderizado general en tres pasos de la siguiente manera:
El paso 1 se expande ligeramente e implica colocar una cámara en la posición de la fuente de luz y luego, según la perspectiva de la luz. fuente Generar mapa de profundidad. El área sombreada de una fuente de luz en una escena es donde la cámara no puede ver la ubicación de la fuente de luz. ShadowMap es esencialmente un mapa de profundidad que registra el valor de profundidad de la superficie más cercana a la fuente de luz en la escena visible desde la ubicación de la fuente de luz.
El lado izquierdo de la imagen de arriba es el mapa de profundidad. Al dibujar la escena en la posición de la cámara a la derecha, puede ver el punto Va en la escena. Su posición correspondiente en el mapa de sombras es A. La profundidad de Va no es mayor que la profundidad almacenada en la posición A en el mapa de profundidad. , por lo que Va no está en la sombra.
Teniendo en cuenta que la tecnología de renderizado de mapas de sombras anterior se remonta a 1978, la gente ha comprendido completamente los pros y los contras que esta tecnología puede aportar al renderizado de gráficos. De vuelta al fenómeno
Con una cierta base del algoritmo de textura de sombra y una cierta comprensión de la estructura de datos utilizada, también podríamos comenzar a estudiar el fenómeno
El punto rojo en el PL está marcado a la derecha Apareció otro punto negro, sin duda cayendo en la región de luz visible. Y dado que la luz está verticalmente hacia abajo, la distancia más corta desde la fuente de luz hasta el punto negro debe ser consistente con el punto rojo en el costado, que es igual a la longitud de la línea roja en la imagen, que es {Profundidad}.
Las cosas se ponen interesantes cuando la luz se inclina para cruzar el plano del objeto (PL) en ángulo. Como todos sabemos, debido al principio de perspectiva, los objetos (PL) cerca de la cámara ocuparán más píxeles en la pantalla que los objetos (fuentes de luz) lejanos. El espacio de fuente de luz que genera ShadowMap tiene un fenómeno similar, pero es así. no causado por la proyección en perspectiva (iluminación directa) Se utiliza proyección ortogonal), sino por la interacción del ángulo y la resolución* * *:
Ahora considere el triángulo BCP lleno de líneas de puntos amarillas en la figura anterior, el área objeto (como el vértice P1) a la fuente de luz La distancia más corta debe ser menor que el valor de profundidad {profundidad} representado por la línea continua roja en la figura de manera similar, en el PED triangular lleno de líneas de puntos negros, la distancia desde todos; Los puntos a la fuente de luz deben ser mayores que el valor de profundidad {profundidad}. Según la definición del algoritmo de proyección de luz, el valor de profundidad del punto P1 en el triángulo BCP después de convertirse al espacio de la fuente de luz es menor que la profundidad de la fuente de luz registrada allí, por lo que P1 no está en la sombra, lo que obviamente es el resultado esperado; sin embargo, P2 en el otro lado del triángulo PED está en Las sombras se asignan en el mismo algoritmo, lo que obviamente es una conclusión errónea.
A través del análisis anterior, podemos ver que bajo las condiciones de un cierto ángulo de iluminación y una cierta resolución de textura, los puntos P1, P y P2 en los tres planos PL que deberían estar en una posición no sombreada El estado se ilumina con iluminación estándar. Después del procesamiento mediante el algoritmo de proyección, se obtendrá una conclusión errónea (resultado de la proyección del área triangular PED), y la causa del error de proyección también se muestra a través del dibujo. Para reflejar el problema de manera más intuitiva y cuantitativa, también podríamos simplificar la ilustración anterior de la siguiente manera ():
En la figura anterior, la línea negra gruesa representa el plano en la escena, y la línea gruesa negra representa el plano en la escena. La línea amarilla representa el plano cercano correspondiente a la fuente de luz. El plano cercano corresponde al mapa de sombras generado. AB se representa como el área correspondiente al texel en el mapa de sombras en este plano cercano.
Suponga que el plano cercano es un cuadrado de tamaño estándar con una longitud de lado FSize. La resolución del mapa de sombras correspondiente se establece en SSize. Luego, el tamaño de las coordenadas correspondientes a AB se puede calcular de la siguiente manera: AB = FSize/SSize.
Esperamos que, desde algunos aspectos, la parte CD proyectada del área correspondiente de texel AB en el plano del objeto pueda estar completamente a la izquierda de la línea de puntos azul en la figura. La solución también es sencilla e intuitiva. Es razonable aumentar ligeramente el valor de profundidad almacenado en el mapa de sombras, preferiblemente lo suficientemente grande como para garantizar que los segmentos de CD estén en áreas sin sombras.
Esta es la primera corrección, que cambia la dirección del rayo:
Observe el segmento de línea (vector) GD, que es la distancia de traslación más corta según la dirección del rayo. . La línea de puntos azul está justo a la derecha del segmento de línea traducido CD, lo que garantiza que al calcular la profundidad de la sombra, la profundidad del segmento CD en el espacio de la fuente de luz puede ser menor que la profundidad de muestreo del mapa de sombras (es decir , la longitud del segmento de línea BD en la figura).
Resolviendo GD:
Además de aumentar directamente la profundidad a lo largo de la dirección de la luz, también se puede compensar a lo largo de la dirección normal para afectar indirectamente el valor de profundidad. Esta es la desviación normal que veremos a continuación.
En realidad, el desplazamiento normal se puede lograr de dos maneras. Un enfoque consiste en reducir la profundidad de los píxeles moviendo los vértices del objeto en la dirección normal antes de transformarlos en un espacio luminoso. Para más detalles, consulte la imagen a continuación:
La otra es compensar los vértices del objeto en la dirección opuesta a la normal al generar el mapa de sombras, aumentando así el valor de profundidad de la sombra disfrazada. . Vea la imagen a continuación para más detalles:
Hablemos primero del primer método. Su mecanismo no es modificar directamente el valor de profundidad de la textura de la sombra, sino minimizar la profundidad del objeto en el espacio de la fuente de luz, por lo que debe implementarse en el sombreador de chips. Con referencia al gráfico [normal 1], la superficie del objeto se mueve una distancia GM a lo largo de su dirección normal y obtiene una nueva posición C’g. Toda el área del segmento CM original se eleva hacia la izquierda de la línea discontinua azul. Sabemos que el valor de profundidad del área C'G debe ser menor o igual que el valor de profundidad EF del punto F, y ahora será iluminado por la fuente de luz normalmente como para algunos segmentos de línea en el lado derecho del punto g; No te preocupes, estarán cubiertos por el ShadowMap adyacente.
El α aquí se refiere al ángulo formado por la dirección de la luz y la dirección de la normal.
El segundo método es muy intuitivo de entender, porque actúa directamente sobre el mapa de sombras para modificar (aumentar) el valor de profundidad en el elemento de textura. Con referencia a la imagen [normal 2], la línea de puntos azul corregida se mueve hacia la parte inferior izquierda una distancia FN, asegurando así que el área del segmento CD esté a la izquierda de la línea de profundidad de la sombra y esté iluminada normalmente. En cuanto al cálculo del desplazamiento MN, debe dividirse en dos pasos:
donde α se refiere al ángulo entre la dirección de la luz y la normal; φ se refiere al ángulo entre la dirección de la fuente de luz y; lo normal.
Unity introduce dos variables de sesgo como razón para controlar los parámetros de profundidad de la sombra. Creo que hay al menos dos niveles. Una es aumentar la flexibilidad, permitiendo a los usuarios ajustar la profundidad de la dirección de la fuente de luz o la dirección normal de acuerdo con las características de la escena misma. Imagínese, si Unity solo proporciona la desviación normal como parámetro, en algunos casos extremos, una desviación normal excesiva hará que la sombra proyectada por el objeto se separe del objeto mismo (Peter Pan).
En cuanto a otro motivo, puedes consultar la imagen de arriba. El desplazamiento se refiere a la curva tanθ en la figura, el desplazamiento normal se refiere a la curva sinθ y θ es el ángulo entre el plano de la fuente de luz y el plano del objeto. Cuando la dirección de la luz es más paralela a la superficie del objeto, el plano de la fuente de luz es más perpendicular a la superficie del objeto y el ángulo θ está más cerca de 90 grados (π/2). En este momento, la distancia de corrección calculada por el sesgo también tenderá al infinito con tan (la flecha azul en la figura está diagonalmente hacia arriba). Si se introduce sinθ en este momento, la influencia del sesgo se puede equilibrar, porque es muy simple: la función sin tiene un límite superior (la flecha horizontal azul en la figura), y podemos dar prioridad al sesgo cuando el El ángulo θ es inferior a 45 grados (π/4) Según el resultado del cálculo de la distancia de compensación, cuando el ángulo θ excede los 45 grados, el peso al calcular la distancia de compensación se desplazará hacia el lado de compensación normal.
Algunas personas pueden preguntar, dado que la compensación calculada usando el sesgo tenderá a infinito, ¿por qué no usar simplemente el sesgo positivo? La respuesta a esto ya se conoce antes: debemos evitar el fenómeno de Peter Pan.
Los dos modos de movimiento del sesgo normal no son exactamente iguales en el efecto real. En algunos casos, cambiar el valor de profundidad de un mapa de sombras en el sombreador de vértices hace que el desplazamiento normal no tenga ningún efecto. Con referencia a la imagen de arriba, la parte más a la izquierda es un caso común de generación de sombras. Debido a que la profundidad del punto C se utiliza en toda la celda para comparar, el segmento ed generará sombras falsas. El diagrama del medio muestra la práctica de agregar profundidad al mapa de sombras mediante un sombreador de vértices. En este método, se sabe que la diferencia de profundidad de C a D se registra como D, y el ángulo entre la línea normal de la luz y el segmento AB es θ, entonces la distancia mínima para eliminar el acné de sombra en la dirección opuesta de la normal se calcula de la siguiente manera:
En este caso, cuando θ tiende a 90° (es decir, la luz es casi paralela a AD) y la distancia mínima tiende al infinito, el desplazamiento normal es difícil de calcular. Alcanza el tamaño para eliminar el acné. El esquema de la derecha muestra cómo se calcula la posición del movimiento del sombreador de mosaicos de modo que incluso si el ángulo cambia, la distancia mínima no se acerca al infinito. Sin embargo, esta parte del cálculo en el sombreador de chip requiere más cálculo que el enfoque anterior.
Gradiente rayado "claro y oscuro", en la versión Unity2019.4.13, use una canalización de representación de anotaciones, active la sombra suave y tome una captura de pantalla.
Para manchas oscuras similares a acné o archivos, en la versión Unity2019.4.13, se utiliza la canalización de representación de etiquetas y la sombra suave se apaga antes de tomar la pantalla.
Queja: Solía preguntarme por qué la autoimagen también se llamaba acné de sombra en lugar de las rayas de sombra más comunes. Hasta que desactivé Soft Light Shadows, borré la corrección de sesgo y vi la imagen de arriba. De hecho, así es como se ve una textura reticular 2D cuando sale mal. Como se muestra en la figura siguiente, el área correspondiente a cada elemento de textura independiente se divide en cuadrados (proyección ortogonal). Cuando encuentra luz incidente en un cierto ángulo en el plano bidimensional, se forman puntos oscuros similares a "acné".
Después del análisis anterior, conocemos este fenómeno
Cuando hay objetos que normalmente producen sombras en la escena (el rectángulo azul en la imagen de arriba representa obstáculos), se produce una desviación global. Agregó: El problema de la autosombra en la imagen de arriba se resuelve, pero también se elimina la sombra que normalmente debería producirse. Cuando la desviación aumenta gradualmente de pequeña a grande, para un objeto que normalmente produce una sombra, su sombra comienza cerca de un extremo del objeto y desaparece gradualmente. Existe un término especializado para este fenómeno llamado "sangrado leve".
A continuación, presentamos el diseño de escena de < 1 > Phenomenon; O incidencia oblicua, esta vez se agrega un nuevo plano (UD) directamente debajo del plano del objeto (P1). Si la profundidad de la sombra no se corrige (ambos sesgos son 0), entonces la línea de contorno CD proyectada por el píxel A en la textura de la sombra se cruzará con el plano PL en el punto P. En este momento, podemos ver el efecto de autosombra en el PL, es decir, rodeado por puntos BCP. El área del triángulo amarillo y el triángulo negro están rodeadas por puntos PDH. Cuando se activa la polarización, la isóbata CD se mueve dos veces en la dirección opuesta a la dirección de la luz y al objeto normal (flecha roja en la imagen), trayendo la posición del segmento de línea GI. Cuando la distancia entre el plano UD y el plano PL es lo suficientemente cercana, el segmento de línea GI se cruzará en el punto P2 en el plano UD, formando dos áreas diferentes rodeadas por los puntos EGP2 e IJP2. Llegados a este punto decimos que hay una "fuga de luz" en el plano UD, es decir, una zona que no debería iluminarse (EP2) ahora está iluminada incorrectamente.
La influencia anormal de la proyección en el plano inferior UD se puede eliminar eliminando los dos desplazamientos. Con referencia al plano de contorno de la textura de sombra representada por el segmento de línea CD en la figura anterior, no aparece en el lado derecho del segmento EJ en el plano UD (o no se cruza con el segmento de línea EJ). Se puede observar que en este caso la proyección del PL se muestra correctamente en el UD.
Bajo la premisa de cancelar el sesgo, cuando reduzcamos aún más la distancia entre los dos planos, podremos volver a reproducir la anomalía. En este momento, los planos superior e inferior pueden considerarse aproximadamente como un solo plano, y el plano inferior UD generará su propia sombra a partir de PL.
Fenómenos
Desde la perspectiva del fenómeno
Si nos interesa este fenómeno
Como lo muestra la flecha verde en la En la figura de arriba, necesitamos En la etapa original de la película, se realiza un pequeño desplazamiento del plano UD en la dirección opuesta a su normal, alejándolo del contorno de compresión GI. Hay una dificultad aquí. ¿Cómo sabemos si un píxel necesita un desplazamiento adicional? ¿O cómo sabemos que el plano del objeto UD necesita un desplazamiento adicional, no el plano del objeto P1? La forma más sencilla es enviar el problema a la CPU, marcar diferentes vértices en la etapa de preprocesamiento y llevar la GPU al cálculo en tiempo de ejecución.