¿Cómo ocluir luces en Unity3D?

9

En primer lugar, soy dueño de Unity Pro.

He estado buscando ocluir luces cuando no se ven desde hace un tiempo para mejorar el rendimiento. Los principales métodos con los que me encontré fueron el uso de BecameVisible () y la prueba de la cámara frustum.

Mi principal problema era que si el jugador está viendo un área que estaría iluminada por la luz, todavía quiero que la luz esté encendida.

Actualmente estoy usando un método que verifica si el área iluminada está en el centro de la cámara, pero el problema es que a veces las luces están en el centro sin que el jugador pueda verlas (por ejemplo, una pared entre ellas y el jugador). He intentado transmitirlos con rayos, pero nunca puedes obtener suficientes detalles sobre el área iluminada real (lo mejor que pude imaginar fue usar renderer.bounds.extent y renderer.bounds.center para calcular los puntos de luz máximos a partir de la luz).

¿Alguien sabe de una manera fácil en Unity Pro para ocluir las luces? ¿O podría decirme una buena manera de usar el método de fulcro de cámara del que estaba hablando?

Timothy Williams
fuente
1
Puede verificar si el frustum de la cámara y las luces se cruzan, pero espero que la unidad ya lo esté haciendo.
Archy
1
En Unity Pro, OcclusionCulling también debe manejar las luces.
Archy
Muy bien, mi artista había dicho que Occlusion Culling no funcionaría para las luces. Entonces, ¿probablemente solo configure mis diversas fuentes de luz como ocluidas en las áreas de oclusión que ya he configurado?
Timothy Williams
Y algo como verificar la cámara y el frustum ligero entre sí puede funcionar, aunque lo necesitaría para funcionar en 360 grados.
Timothy Williams
La eliminación de oclusiones parece no funcionar con luces, a pesar de lo que el artista y yo intentamos. ¿Cómo exactamente ocluiría una luz?
Timothy Williams el

Respuestas:

1

Podrías escribir tu propio guión para ocluir las luces. Algo como esto conectado a la cámara principal:

List<Light> Lights = new List<Light>();
const float OccludeDist = 100;
void Update()
{
    foreach (Light light in Lights)
    {
        if ((transform.position - light.transform.position).sqrMagnitude > OccludeDist * OccludeDist))
        {
            light.enabled = false;
        }
        else{
            light.enabled = true;
        }
    }
}

También puede verificar si el punto está dentro de un ángulo en el eje Y de la cámara (los otros ejes simplemente le causarán dolor). Sea un poco generoso con el ángulo, tal vez 2 veces el frustrum de la cámara, para que las luces no se apaguen cuando están iluminando áreas dentro de la vista de la cámara. Si elige agregar esta optimización adicional (que probablemente no será necesaria), asegúrese de usar la distancia como la fase ancha porque es mucho menos costosa.

JPtheK9
fuente
Nice and simple :)
Ḟḹáḿíṅḡ Ⱬỏḿƀíé