Version: 2023.2
LanguageEnglish
  • C#

CommandBuffer.SetShadowSamplingMode

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Submission failed

For some reason your suggested change could not be submitted. Please <a>try again</a> in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Cancel

Declaration

public void SetShadowSamplingMode(Rendering.RenderTargetIdentifier shadowmap, Rendering.ShadowSamplingMode mode);

Parameters

shadowmap Shadowmap render target to change the sampling mode on.
mode New sampling mode.

Description

Add a "set shadow sampling mode" command.

Shadowmap render textures are normally set up to be sampled with a comparison filter - the sampler gets a shadow-space depth value of the screen pixel and returns 0 or 1, depending on if the depth value in the shadowmap is smaller or larger. That's the default ShadowSamplingMode.CompareDepths mode and is used for rendering shadows.

If you'd like to access the shadowmap values as in a regular texture, set the sampling mode to ShadowSamplingMode.RawDepth.

Shadowmap's sampling mode will be reverted to default after the the last command in the current CommandBuffer.

Check SystemInfo.supportsRawShadowDepthSampling to verify if current runtime platform supports sampling shadows this way. Notably, DirectX9 does not.

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); } }