¿Por qué algunos juegos muestran luces que brillan a través de las paredes?

28

En algunos juegos, veo luces brillando a través de las paredes, incluso si configuro la calidad de video en niveles altos.

Un par de ejemplos de juegos que jugué recientemente son Borderlands 2 (explosiones de misiles) y Call of Cthulhu (linternas; el juego incluso usa Unreal Engine 4).

¿Es esto un error o hay razones de rendimiento?

Ejemplo Borderlands 2: https://youtu.be/9bV83qA6_mU?t=419 (pocas veces, pero rápidamente)

Pregunta adicional: en el último caso, ¿hay alguna forma de que el trazado de rayos se pueda utilizar de forma económica para resolver el problema? Supongo que la RT costosa definitivamente resolvió el problema, pero me pregunto si también se puede usar de forma "barata" para resolver este problema específico.

Marcus
fuente
21
Una imagen vale más que 1000 palabras.
Evorlor
8
Tendría que ir a jugar para probar, pero ¿es realmente la luz la que se filtra o podría ser un efecto de partículas brillantes? Particularmente su ejemplo de una explosión de misil, podría imaginar un efecto aditivo de partículas de "fuego" que es muy probable que ignore las colisiones. Linternas también podrían hacer lo mismo para crear un halo visible, supongo ...
CA
@Evorlor agregó un ejemplo.
Marcus

Respuestas:

43

Ampliando la respuesta correcta de TomTsagk, pensé que podría ser útil describir un poco más sobre por qué los juegos funcionan así.

La luz en los juegos realmente no "viaja" desde la fuente, a la superficie, a la cámara, obstruyéndose en el camino.

Para determinar qué tan brillante es dibujar cada píxel de una superficie en función de una luz dada, usamos (o aproximamos) una fórmula matemática que usa la dirección de la superficie y la dirección desde este punto en la superficie hasta la fuente de luz. Eso es todo, solo la dirección desde la que está brillando: normalmente no emitimos un rayo para verificar si la luz realmente alcanza este píxel, porque hacer eso para cada píxel en la pantalla y verificar el rayo contra toda la geometría detallada de la escena es por lo general, sigue siendo demasiado caro para juegos en tiempo real.

Entonces, por defecto, ninguna luz del juego proyecta sombras. La dirección hacia una luz se mantiene igual incluso si hay un emisor de sombras en el camino, por lo que las matemáticas nos dan el mismo valor de brillo.

Si queremos simular sombras, tenemos que hacerlo por separado. Una forma común es con lo que se llama un Mapa de sombras. En esta versión, antes de sombrear nuestra escena, primero renderizamos la escena desde la perspectiva de cada luz, como si esa luz fuera una cámara, almacenando la profundidad de cada píxel que ve en una textura fuera de la pantalla.

Luego, cuando sombreamos la escena, podemos comparar la distancia matemática de este píxel desde la fuente de luz con la profundidad que registramos en el píxel correspondiente en el mapa de sombras. Si la profundidad del mapa de sombras es menor, significa que hay otra superficie entre aquí y la luz, y dibujamos este píxel en la sombra.

Hay muchas técnicas geniales para hacer que estas sombras basadas en mapas se vean más bonitas, con menos artefactos / alias, pero las pasaré por alto por ahora. Baste decir que, en general, tampoco son libres.

Debido a que esto requiere renderizar (hasta) toda la escena nuevamente desde la perspectiva de cada luz, hasta seis veces si es un punto de luz que brilla en todas las direcciones {norte, sur, este, oeste, arriba, abajo}, y necesitamos volver - Entregue el mapa de sombras cada vez que algo se mueva, esto puede ser muy costoso.

Por lo tanto, los juegos a menudo centrarán su presupuesto de renderizado en las luces más importantes de la escena, como la luz solar direccional, para garantizar que tengan sombras atractivas. Las pequeñas luces pequeñas, de corta duración, como el destello de una explosión, a menudo son perdonables si se escapan un poco de los oclusores. A menudo, esto es más aceptable para los jugadores que un problema en la velocidad de fotogramas debido a un aumento repentino en el costo de representación de todos los cálculos y la representación adicional del mapa de sombras. Especialmente si es una escena de acción ocupada donde la fluidez es más importante que la perfección de píxeles.

DMGregory
fuente
3
Otra arruga es que, si bien es trivial averiguar si una fuente de luz está enfrente o detrás de una superficie, evitar que las superficies brillen cuando se iluminan por detrás a menudo producirá resultados de aspecto extraño.
supercat
Y esto es especialmente cierto con los efectos de partículas (que la explosión probablemente sea, al menos parcialmente), ya que las partículas deben ser especialmente baratas de manejar para ser muy útiles.
Luaan
2
Las luces y las partículas son dos cosas diferentes. Una partícula también puede "filtrarse" a través de un obstáculo, pero por razones completamente diferentes. A veces, un sistema de partículas también incluirá una luz para ayudar a vender el efecto (piense en una fogata o enjambre de luciérnagas), pero una luz dentro de un efecto de partículas sigue siendo solo una luz, por lo general no es una variante especial.
DMGregory
2
Un enfoque alternativo para mapas de sombras es volúmenes de sombra , que corrige el problema aliasing, pero es más caro: requiere geometría extra para ser prestados (un nuevo polígono por borde silueta de cada objeto para cada fuente de luz), así como la representación adicional pases. Sin embargo, esperaría que el enfoque de mapeo sea lo suficientemente bueno para la mayoría de las situaciones.
DarthFennec
22

En pocas palabras, esto sucede por razones de rendimiento.

Cuando hay una luz en la pantalla, por defecto brilla en todos los objetos (obstruidos o no), por lo que el juego necesitaría hacer cálculos adicionales para ver qué objeto se ve afectado por qué.

Esto es más fácil de resolver en objetos estáticos mediante el uso de iluminación estática y horneada, pero esto no es lo mismo en luces dinámicas, como las explosiones como notó.

Para su pregunta adicional, el trazado de rayos y barato no van juntos en la misma oración. La única razón por la que el trazado de rayos no se ha generalizado hasta ahora es el rendimiento. Suponiendo que todas las luces usan trazado de rayos, entonces este problema se "resolvería", pero a expensas del rendimiento.

TomTsagk
fuente
66
Entonces, ¿el trazado de rayos es más importante para las películas CGI que para los juegos en tiempo real?
Acumulación
21
@ Acumulación Eso es correcto. Un solo cuadro de una película puede tardar horas en renderizarse, mientras que un juego solo tiene milisegundos.
NobodyNada - Restablece a Monica el
16
Dicho esto, los juegos están explorando cada vez más el uso de trazado de rayos o raymarching junto con técnicas de rasterización, permitiendo que el rasterizador haga lo que es bueno y que los rayos hagan lo que son buenos. No es un trazado de rayos completo de cada píxel, pero aún puede obtener algunos efectos excelentes de esa manera.
DMGregory
2
@DMGregory De hecho, juegos como Duke Nukem 3D ya usaban una variante muy simplificada de trazado de rayos, aunque no se usaba para iluminación dinámica, y definitivamente no trazaba cada píxel en la pantalla (generalmente, se hacía para cada columna de píxeles), y los reflejos y la transparencia seguían siendo un caso especial más que el predeterminado. El renderizado 3D de software siempre ha jugado con enfoques similares, fue el hardware 3D que cerró esa avenida (hasta ahora).
Luaan
@Acccumulation Raytracing viene en diferentes niveles, por lo que si bien los juegos pueden disparar rayos primarios en la parte superior de la línea, todavía no hacen suficientes rebotes secundarios o múltiples rebotes por píxel. Por lo tanto, incluso si tuviera que rastrear, todavía tendría compensaciones de rendimiento como esta. Por lo tanto, la capacidad de rastrear las luces principales aún no significa que pueda permitirse renderizar todas las luces secundarias.
joojaa