Mutltiple Cameras with different lights

Does anyone know a way to get different lights/light properties rendered for two cameras pointed at the same scene rendering at the same time?

I used to be able to disable/enable lights during the RenderPipelineManager.beginCameraRendering and RenderPipelineManager.endCameraRendering callbacks in the 2019.2 beta but i guess something changed in the implementation.

Maybe there is something I can do with the new CustomPass stuff?

If anyone has any pointers it would be great.

Actually nevermind. I’ve found SetLightDimmer on HDAdditionalLightData does actually get checked in the lightloop if I update that in those callbacks. So I can just set that instead of messing with gameObject.SetActive or Light.enabled

I had the same problem, I share my solution for URP if someone need it in the futur.
you have just to test if the camera is the good camera (it’s a little strange).

for disabling lights for a specific camera add this script to the camera and use addLight(Light) to add lights to disable

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
public class DisableLightsForCam : MonoBehaviour
{
    public List<Light> Lights;
    private Camera currentCam;

    private void OnEnable()
    {
        currentCam = transform.GetComponent<Camera>();
        RenderPipelineManager.beginCameraRendering += RenderPipelineManager_beginCameraRendering;
        RenderPipelineManager.endCameraRendering += RenderPipelineManager_endCameraRendering;
    }

    private void OnDisable()
    {
        RenderPipelineManager.beginCameraRendering -= RenderPipelineManager_beginCameraRendering;
        RenderPipelineManager.endCameraRendering -= RenderPipelineManager_endCameraRendering;
    }

     private void RenderPipelineManager_beginCameraRendering(ScriptableRenderContext context, Camera camera)
    {
        foreach (Light light in Lights)
        {
            if (camera == currentCam) light.enabled = false;
        }
    }

    private void RenderPipelineManager_endCameraRendering(ScriptableRenderContext context, Camera camera)
    {
        foreach (Light light in Lights)
        {
            if (camera == currentCam) light.enabled = true;
        }
    }

    public void addLight (Light light)
    {
        Lights.Add(light);
    }

    public void removeLight (Light light)
    {
        Lights.Remove(light);
    }

}

for enabling lights for a specific camera add this script to the camera and use addLight(Light) to add lights to enable

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
public class EnableLightsForCam : MonoBehaviour
{
    public List<Light> Lights;
    private Camera currentCam;

    private void OnEnable()
    {
        currentCam = transform.GetComponent<Camera>();
        RenderPipelineManager.beginCameraRendering += RenderPipelineManager_beginCameraRendering;
        RenderPipelineManager.endCameraRendering += RenderPipelineManager_endCameraRendering;
    }

    private void OnDisable()
    {
        RenderPipelineManager.beginCameraRendering -= RenderPipelineManager_beginCameraRendering;
        RenderPipelineManager.endCameraRendering -= RenderPipelineManager_endCameraRendering;
    }

     private void RenderPipelineManager_beginCameraRendering(ScriptableRenderContext context, Camera camera)
    {
        foreach (Light light in Lights)
        {
            if (camera == currentCam) light.enabled = true;
        }
    }

    private void RenderPipelineManager_endCameraRendering(ScriptableRenderContext context, Camera camera)
    {
        foreach (Light light in Lights)
        {
            if (camera == currentCam) light.enabled = false;
        }
    }
    public void addLight (Light light)
    {
        Lights.Add(light);
    }

    public void removeLight (Light light)
    {
        Lights.Remove(light);
    }
}
1 Like