Version: 2017.2 (switch to 2017.3b)
LanguageEnglish
  • C#
  • JS

Script language

Select your preferred scripting language. All code snippets will be displayed in this language.

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

public method SetShadowSamplingMode(shadowmap: Rendering.RenderTargetIdentifier, mode: Rendering.ShadowSamplingMode): void;
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.

#pragma strict
@RequireComponent(Camera)
public class RawShadowmapDepth extends MonoBehaviour {
	public var m_Light: Light;
	var m_ShadowmapCopy: RenderTexture;
	function Start() {
		var shadowmap: RenderTargetIdentifier = BuiltinRenderTextureType.CurrentActive;
		m_ShadowmapCopy = new RenderTexture(1024, 1024, 0);
		var cb: CommandBuffer = 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.
	}
	function OnRenderImage(src: RenderTexture, dest: RenderTexture) {
		// 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);
	}
}
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); } }

Did you find this page useful? Please give it a rating: