shadowmap | 要更改采样模式的阴影贴图渲染目标。 |
mode | 新采样模式。 |
添加“设置阴影采样模式”命令。
阴影贴图渲染纹理通常设置为使用比较过滤器来采样 - 采样器获取屏幕像素的阴影空间深度值,并根据阴影贴图中的深度值更小还是更大返回 0 或 1。这是默认的 ShadowSamplingMode.CompareDepths 模式,用于渲染阴影。
如果您要像在常规纹理中一样访问阴影贴图的值,请将采样模式设置为 ShadowSamplingMode.RawDepth。
在执行完当前 CommandBuffer 中的最后一条命令后,阴影贴图的采样模式将恢复默认值。
检查 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);
}
}