Maneja muchas luces en una escena (con sombreadores)


9

Tengo curiosidad acerca de cómo manejar muchas luces en una escena. Dado un mapa muy grande en un juego de rol, con mazmorras (con luces allí), etc. Sé acerca de la iluminación diferida, pero eso solo responde cómo representar muchas luces. Pero mi pregunta es más: cómo no renderizar muchas luces. Obviamente, es deseable renderizar solo las luces que afectan la escena, pero no conozco una técnica / un algoritmo para archivar esto. Nadie quiere ni es capaz de renderizar 500 puntos de luz, solo porque hay en algún lugar del mapa. Pero uno no puede simplemente tomar una línea recta desde la luz hasta el jugador y probar si hay algo en el medio. La distancia tampoco parece un buen indicador. (¿Luz del sol?)

tl; dr: ¿Cómo puedo determinar qué luces afectan la escena para representarlas solo?


OpenGL o DirectX?
kravemir

66
en realidad, 500 luces serían bastante posibles con iluminación diferida, siempre y cuando no desee sombras para todas ellas;)

Por ejemplo, para las ligaduras de punto y cono, puede utilizar la eliminación de oclusión: la luz de punto es solo una esfera. La luz direccional se ve desde todas partes
Kikaimaru

44
@Darkwings Básicamente estás describiendo aquí lo que pidió Blubb. Como camino? Bueno, creo que la solución aquí es solo caminar. (Funcionó para mí.) ;-) "necesitas saber si esa fuente está iluminando algo en tu punto de vista". <- Eso es exactamente lo que pide, quiere saber cómo puede hacer eso. ^^ Aunque lo del cono / esfera de Kikaimaru es probablemente útil.
cooky451

1
Para el OP, no era obvio verificar el punto de vista ya que solo mencionó la distancia. Cada luz tendrá algunos parámetros para determinar eso. Si se usan luces direccionales, llegarán a todas partes, los focos tendrán una zona objetivo (por lo que podría resolverse con la intersección del plano vectorial) y así sucesivamente. Debería pensar más en qué líneas desea que las luces afecten a la escena, dado que si realmente tiene muchas luces muy cerca una de la otra, será mejor que se aproxime (para proyectar sombras). IE: 100 velas en un candelabro antiguo se pueden manejar como una sola luz.
Darkwings

Respuestas:


5

Incluso más simple que los volúmenes delimitadores;

Asigna un radio a cada luz. Cuando se trata de renderizar su escena, simplemente verifique si la distancia entre sus objetos de escena y cada luz es menor que el radio de la luz. Si es así, usa la luz, de lo contrario, sáltatela.

Solo una fracción más complicada, dependiendo de la importancia del rendimiento:

También puede hacer una especie de verificación de fase amplia con esto. Simplemente defina una cuadrícula espacial que almacene las manijas para sus luces en una celda de cuadrícula, luego solo realice la verificación de distancia en las luces que están en las celdas dentro del radio máximo de los objetos de su escena.


55
+1 - Suena sospechosamente como una esfera delimitadora, sin embargo;)
Gyan alias Gary Buyn

Un poco tarde ... de todos modos, eso es exactamente una esfera delimitadora. Usando ese método, todavía renderizará luces que están completamente oscurecidas por paredes, etc. y, por lo tanto, no son relevantes para la escena. Además, no todas las luces van en todas las direcciones.
Darkwings

5

La forma más simple en que puedo pensar (seamos honestos, la única forma en que he pensado) es darle a cada luz un volumen delimitador . Si el volumen delimitador se cruza con el frustum de la vista (o un volumen delimitador del frustum de la vista), aplique la luz.

Todavía podría haber luces que se apliquen aunque no afecten ningún objeto visible, pero es simple y rápido. La disposición inteligente de su gráfico de escena podría significar que solo unas pocas verificaciones de intersección eliminan la mayoría de sus luces (al igual que lo que se hace para el sacrificio de objetos).

Algo así como el sol podría no tener un volumen delimitador (para indicar que siempre debe aplicarse).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.