|
|
|
|
|
|
public Vector3 directionalLightCascades; |
|
|
|
public float directionalLightNearPlaneOffset; |
|
|
|
|
|
|
|
public RenderTextureFormat renderTextureFormat; |
|
|
|
public RenderTextureFormat shadowmapTextureFormat; |
|
|
|
public RenderTextureFormat screenspaceShadowmapTextureFormat; |
|
|
|
|
|
|
|
static ShadowSettings defaultShadowSettings = null; |
|
|
|
|
|
|
|
|
|
|
defaultShadowSettings.directionalLightCascades = new Vector3(0.05F, 0.2F, 0.3F); |
|
|
|
defaultShadowSettings.directionalLightNearPlaneOffset = 5; |
|
|
|
defaultShadowSettings.maxShadowDistance = 1000.0F; |
|
|
|
defaultShadowSettings.renderTextureFormat = RenderTextureFormat.Shadowmap; |
|
|
|
defaultShadowSettings.shadowmapTextureFormat = RenderTextureFormat.Shadowmap; |
|
|
|
defaultShadowSettings.screenspaceShadowmapTextureFormat = RenderTextureFormat.R8; |
|
|
|
} |
|
|
|
return defaultShadowSettings; |
|
|
|
} |
|
|
|
|
|
|
if (!shadows) |
|
|
|
{ |
|
|
|
var setRT = CommandBufferPool.Get("Generate Small Shadow Buffer"); |
|
|
|
int shadowmapID = m_ShadowSettings.screenSpace ? m_ScreenSpaceShadowMapRTID : m_ShadowMapRTID; |
|
|
|
setRT.GetTemporaryRT(shadowmapID, 4, 4, 0, FilterMode.Bilinear, RenderTextureFormat.ARGB32); |
|
|
|
if (m_ShadowSettings.screenSpace) |
|
|
|
setRT.GetTemporaryRT(m_ScreenSpaceShadowMapRTID, 4, 4, 0, FilterMode.Bilinear, m_ShadowSettings.screenspaceShadowmapTextureFormat); |
|
|
|
else |
|
|
|
setRT.GetTemporaryRT(m_ShadowMapRTID, 4, 4, 0, FilterMode.Bilinear, m_ShadowSettings.shadowmapTextureFormat); |
|
|
|
setRT.Blit(Texture2D.whiteTexture, m_ScreenSpaceShadowMapRT); |
|
|
|
context.ExecuteCommandBuffer(setRT); |
|
|
|
} |
|
|
|
|
|
|
{ |
|
|
|
var desc = XRSettings.eyeTextureDesc; |
|
|
|
desc.depthBufferBits = 0; |
|
|
|
desc.colorFormat = RenderTextureFormat.R8; |
|
|
|
desc.colorFormat = m_ShadowSettings.screenspaceShadowmapTextureFormat; |
|
|
|
cmd.GetTemporaryRT(m_ScreenSpaceShadowMapRTID, m_CurrCamera.pixelWidth, m_CurrCamera.pixelHeight, 0, FilterMode.Bilinear, RenderTextureFormat.R8); |
|
|
|
cmd.GetTemporaryRT(m_ScreenSpaceShadowMapRTID, m_CurrCamera.pixelWidth, m_CurrCamera.pixelHeight, 0, FilterMode.Bilinear, m_ShadowSettings.screenspaceShadowmapTextureFormat); |
|
|
|
// Note: The source isn't actually 'used', but there's an engine peculiarity (bug) that
|
|
|
|
// Note: The source isn't actually 'used', but there's an engine peculiarity (bug) that
|
|
|
|
// doesn't like null sources when trying to determine a stereo-ized blit. So for proper
|
|
|
|
// stereo functionality, we use the screen-space shadow map as the source (until we have
|
|
|
|
// a better solution).
|
|
|
|
|
|
|
m_ShadowSettings.shadowAtlasWidth = m_Asset.ShadowAtlasResolution; |
|
|
|
m_ShadowSettings.shadowAtlasHeight = m_Asset.ShadowAtlasResolution; |
|
|
|
m_ShadowSettings.maxShadowDistance = m_Asset.ShadowDistance; |
|
|
|
m_ShadowSettings.renderTextureFormat = SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.Shadowmap) |
|
|
|
m_ShadowSettings.shadowmapTextureFormat = SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.Shadowmap) |
|
|
|
|
|
|
|
m_ShadowSettings.screenspaceShadowmapTextureFormat = SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.R8) |
|
|
|
? RenderTextureFormat.R8 |
|
|
|
: RenderTextureFormat.ARGB32; |
|
|
|
|
|
|
|
switch (m_ShadowSettings.directionalLightCascadeCount) |
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
var cmd = CommandBufferPool.Get("Prepare Shadowmap"); |
|
|
|
cmd.GetTemporaryRT(m_ShadowMapRTID, m_ShadowSettings.shadowAtlasWidth, |
|
|
|
m_ShadowSettings.shadowAtlasHeight, kShadowBufferBits, FilterMode.Bilinear, m_ShadowSettings.renderTextureFormat); |
|
|
|
m_ShadowSettings.shadowAtlasHeight, kShadowBufferBits, FilterMode.Bilinear, m_ShadowSettings.shadowmapTextureFormat); |
|
|
|
// LightweightPipeline.SetRenderTarget is meant to be used with camera targets, not shadowmaps
|
|
|
|
CoreUtils.SetRenderTarget(cmd, m_ShadowMapRT, ClearFlag.Depth, CoreUtils.ConvertSRGBToActiveColorSpace(m_CurrCamera.backgroundColor)); |
|
|
|
|
|
|
|