Как в Universal Render Pipeline (URP) сделать так, чтобы камера игнорировала свет?

Я хочу создать камеру ночного видения, подобную той, что используется в игре Outlast. Мне необходимо, чтобы источник света (spot light) освещал окружение исключительно через эту камеру. В проекте, использующем Built-in Render Pipeline, я применял следующий скрипт, и MainCamera успешно игнорировала свет от камеры ночного видения:

<pre><code class="cs">public class IgnoreNightVisionLight : MonoBehaviour
{
    [SerializeField] private Light limelight;

    private void OnPreCull()
    {
        limelight.enabled = false;
    }
    private void OnPreRender()
    {
        limelight.enabled = false;
    }
    private void OnPostRender()
    {
        limelight.enabled = true;
    }
}</code></pre>

Однако в проекте с URP рендеринг работает иначе, и этот скрипт больше не выполняет свою функцию. Я также пробовал установить специальный слой для источника света и исключить его из Culling Mask MainCamera, но это тоже не дало результата. Я не смог найти решение данной проблемы через Google, и сейчас не знаю, как это исправить. 

Если есть другие простые методы для реализации камеры ночного видения, которая будет освещать окружение только для неё, буду признателен за информацию.
  • 17 ноября 2024 г. 12:33
Ответы на вопрос 2
В Universal Render Pipeline (URP) существует несколько способов, чтобы создать эффект камеры ночного видения, при этом исключая освещение от источников света, использующихся в других камерах. Вот один из способов, который позволит вам достичь желаемого эффекта:

### Шаг 1: Используйте отдельные слои для света и объектов

1. **Создайте новые слои**:
   - Создайте новый слой для объеков, которые будут освещаться ночью (например, `NightVisionObjects`) и для источника света (например, `NightVisionLight`).
   
2. **Назначьте объекты и источник света**:
   - Назначьте объекты, которые должны быть освещены только ночным видением, на слой `NightVisionObjects`.
   - Назначьте источник света (spot light) на слой `NightVisionLight`.

### Шаг 2: Настройка камеры ночного видения

1. **Создайте новую камеру для ночного видения**:
   - Создайте новую камеру (например, `NightVisionCamera`) и настройте её так, как вам нужно.
   - Убедитесь, что камера настроена для рендеринга только нужного слоя (`NightVisionObjects`) и `NightVisionLight`.

2. **Настройка Culling Mask**:
   - В Culling Mask вашей камеры ночного видения выберите только слои `NightVisionObjects` и `NightVisionLight`.
   - Убедитесь, что основная камера (`MainCamera`) настроена таким образом, чтобы игнорировать слои `NightVisionObjects` и `NightVisionLight`.

### Шаг 3: Игнорирование источников света

URP позволяет управлять рендерингом через **дополнительные настройки материала** и **пост-обработку**. Вы можете использовать скрипты для управления состоянием источников света, но URP работает иначе, чем Built-in Render Pipeline. Надо учитывать следующее:

- Проверьте, правильно ли работают световые источники на вашей `NightVisionCamera` с учетом их слоёв.
- Возможно, вам придется вмешиваться в управление освещением через `Render Features` или специальные шейдеры, которые обеспечивают необходимые эффекты.

### Пример кода

Если вы хотите использовать скрипт для управления включением/выключением освещения, вы можете адаптировать ваш код, например, так:

```csharp
public class NightVisionLightControl : MonoBehaviour
{
    [SerializeField] private Light nightVisionLight;
    [SerializeField] private Camera nightVisionCamera;

    private void Update()
    {
        if (nightVisionCamera.enabled)
        {
            nightVisionLight.enabled = true;
        }
        else
        {
            nightVisionLight.enabled = false;
        }
    }
}
```

В этом случае вы будете просто включать освещение, когда камера активна.

### Важно!

Учтите, что если вы используете эффекты пост-обработки (например, для создания эффекта ночного видения), убедитесь, что они применяются корректно только к вашей камере ночного видения, и что объекты объемов не пересекаются. Если у вас есть специфические визуальные эффекты, рассмотрите возможность использования специальных шейдеров для достижения нужного результата.

### Заключение

Можно комбинировать различные методы настройки камер и управления освещением, чтобы получить желаемый результат. URP требует более специализированного подхода по сравнению с Built-in Render Pipeline, поэтому написать правильный код управления освещением будет важным шагом в реализации вашего проекта.
public class CameraLight : MonoBehaviour
{
    [SerializeField] private Camera _camera;
    [SerializeField] private Light _light;
    
    void OnEnable()
    {
        RenderPipelineManager.beginCameraRendering += OnBeginCameraRendering;
        RenderPipelineManager.endCameraRendering += OnEndCameraRendering;
    }
    
    void OnDisable()
    {
        RenderPipelineManager.beginCameraRendering -= OnBeginCameraRendering;
        RenderPipelineManager.endCameraRendering -= OnEndCameraRendering;
    }
    
    void OnBeginCameraRendering(ScriptableRenderContext context, Camera cam)
    {
        if (cam == _camera)
        {
            _light.enabled = false;
        }
    }
    
    void OnEndCameraRendering(ScriptableRenderContext context, Camera cam)
    {
        if (cam == _camera)
        {
            _light.enabled = true;
        }
    }
}
Похожие вопросы