Объявление
public void SetShadowSamplingMode(Rendering.RenderTargetIdentifier shadowmap, Rendering.ShadowSamplingMode mode);Параметры
shadowmap | Цель рендеринга Shadowmap для изменения режима выборки на. |
mode | Новый режим выборки. |
Описание
Добавить команду "установить режим выборки теней".
Текстуры рендеринга карты теней обычно настраиваются для выборки с фильтром сравнения — сэмплер получает значение глубины теневого пространства пикселя экрана и возвращает 0 или 1, в зависимости от того, меньше или больше значение глубины в карте теней. . Это режим ShadowSamplingMode.CompareDepths по умолчанию, который используется для рендеринга теней.
Если вы хотите получить доступ к значениям карты теней, как в обычной текстуре, установите режим выборки ShadowSamplingMode.RawDepth.
Режим сэмплирования карты теней будет возвращен к значению по умолчанию после последней команды в текущем командном буфере.
Проверьте SystemInfo.supportsRawShadowDepthSampling, чтобы убедиться, что текущая платформа среды выполнения поддерживает такой способ выборки теней. Примечательно, что DirectX9 этого не делает.
using UnityEngine;
using UnityEngine.Rendering;
[RequireComponent(typeof(Camera))]
public class RawShadowmapDepth : MonoBehaviour
{
public Light m_Light;
RenderTexture m_ShadowmapCopy;
void Start()
{
RenderTargetIdentifier shadowmap = BuiltinRenderTextureType.CurrentActive;
m_ShadowmapCopy = new RenderTexture(1024, 1024, 0);
CommandBuffer cb = new CommandBuffer();
// Change shadow sampling mode for m_Light's shadowmap.
cb.SetShadowSamplingMode(shadowmap, ShadowSamplingMode.RawDepth);
// The shadowmap values can now be sampled normally - copy it to a different render texture.
cb.Blit(shadowmap, new RenderTargetIdentifier(m_ShadowmapCopy));
// Execute after the shadowmap has been filled.
m_Light.AddCommandBuffer(LightEvent.AfterShadowMap, cb);
// Sampling mode is restored automatically after this command buffer completes, so shadows will render normally.
}
void OnRenderImage(RenderTexture src, RenderTexture dest)
{
// Display the shadowmap in the corner.
Camera.main.rect = new Rect(0, 0, 0.5f, 0.5f);
Graphics.Blit(m_ShadowmapCopy, dest);
Camera.main.rect = new Rect(0, 0, 1, 1);
}
}