Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,11 @@ public static class XRBuiltinShaderConstants
/// </summary>
static public readonly int unity_StereoWorldSpaceCameraPos = Shader.PropertyToID("unity_StereoWorldSpaceCameraPos");

/// <summary>
/// Cached unique id for unity_StereoEyeIndex
/// </summary>
static public readonly int unity_StereoEyeIndex = Shader.PropertyToID("unity_StereoEyeIndex");

// Pre-allocate arrays to avoid GC
static Matrix4x4[] s_cameraProjMatrix = new Matrix4x4[2];
static Matrix4x4[] s_invCameraProjMatrix = new Matrix4x4[2];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,8 @@ private void ClearEditorsList()
private void ForceSave()
{
EditorUtility.SetDirty(target);
AssetDatabase.SaveAssetIfDirty(target);
AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(target));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ public LightStats GetLightStatsByLayer(int layerID, ref LayerBatch layer)
returnStats.totalNormalMapUsage++;
if (light.volumeIntensity > 0 && light.volumetricEnabled)
returnStats.totalVolumetricUsage++;
if (light.volumeIntensity > 0 && light.volumetricEnabled && RendererLighting.CanCastShadows(light, layerID))
if (RendererLighting.CanCastVolumetricShadows(light, layer.endLayerValue))
returnStats.totalVolumetricShadowUsage++;

returnStats.blendStylesUsed |= (uint)(1 << light.blendStyleIndex);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -217,13 +217,12 @@ internal static bool CanCastShadows(Light2D light, int layerToRender)
return light.shadowsEnabled && light.shadowIntensity > 0 && light.IsLitLayer(layerToRender);
}

#if URP_COMPATIBILITY_MODE
private static bool CanCastVolumetricShadows(Light2D light, int endLayerValue)
internal static bool CanCastVolumetricShadows(Light2D light, int endLayerValue)
{
var topMostLayerValue = light.GetTopMostLitLayer();
return light.volumetricShadowsEnabled && light.shadowVolumeIntensity > 0 && topMostLayerValue == endLayerValue;
return light.volumeIntensity > 0 && light.volumetricEnabled && light.volumetricShadowsEnabled && light.shadowVolumeIntensity > 0 && light.GetTopMostLitLayer() == endLayerValue;
}

#if URP_COMPATIBILITY_MODE
internal static void RenderLight(IRenderPass2D pass, CommandBuffer cmd, Light2D light, bool isVolume, int blendStyleIndex, int layerToRender, bool hasShadows, bool batchingSupported, ref int shadowLightCount)
{
Mesh lightMesh = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,8 @@ private static void Execute(RasterCommandBuffer cmd, PassData passData, ref Laye
layerBatch.endLayerValue != light.GetTopMostLitLayer()))
continue;

var useShadows = passData.layerBatch.lightStats.useShadows && layerBatch.shadowIndices.Contains(j);
var useShadows = (!passData.isVolumetric && passData.layerBatch.lightStats.useShadows) || (passData.isVolumetric && passData.layerBatch.lightStats.useVolumetricShadowLights);
useShadows &= layerBatch.shadowIndices.Contains(j);
var lightMaterial = passData.rendererData.GetLightMaterial(light, passData.isVolumetric, useShadows);
var lightMesh = light.lightMesh;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ internal class PassData
internal Renderer2DData rendererData;
internal TextureHandle[] shadowTextures;
internal TextureHandle shadowDepth;
internal bool isVolumetric;
}

public void Render(RenderGraph graph, ContextContainer frameData, Renderer2DData rendererData, ref LayerBatch layerBatch, int batchIndex, bool isVolumetric = false)
Expand All @@ -54,6 +55,7 @@ public void Render(RenderGraph graph, ContextContainer frameData, Renderer2DData

using (var builder = graph.AddUnsafePass<PassData>(!isVolumetric ? k_ShadowPass : k_ShadowVolumetricPass, out var passData, !isVolumetric ? m_ProfilingSampler : m_ProfilingSamplerVolume))
{
passData.isVolumetric = isVolumetric;
passData.layerBatch = layerBatch;
passData.rendererData = rendererData;
passData.shadowTextures = universal2DResourceData.shadowTextures[batchIndex];
Expand All @@ -74,6 +76,9 @@ public void Render(RenderGraph graph, ContextContainer frameData, Renderer2DData
var index = data.layerBatch.shadowIndices[i];
var light = data.layerBatch.lights[index];

if (data.isVolumetric && !RendererLighting.CanCastVolumetricShadows(light, data.layerBatch.endLayerValue))
continue;

// Shadow Pass
ExecuteShadowPass(cmd, data, light, i);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,11 @@ private RenderPassInputSummary GetRenderPassInputs(UniversalCameraData cameraDat
inputSummary.requiresColorTexture |= needsColor;
}

// Volumetric shadow pass requires intermediate texture
bool hasVolumetricShadowPass = false;
for (int i = 0; i < m_BatchCount; ++i)
hasVolumetricShadowPass |= m_LayerBatches[i].lightStats.useVolumetricShadowLights;

inputSummary.requiresColorTexture |= cameraData.postProcessEnabled
|| cameraData.isHdrEnabled
|| cameraData.isSceneViewCamera
Expand All @@ -205,7 +210,8 @@ private RenderPassInputSummary GetRenderPassInputs(UniversalCameraData cameraDat
|| m_Renderer2DData.useCameraSortingLayerTexture
|| !Mathf.Approximately(cameraData.renderScale, 1.0f)
|| (DebugHandler != null && DebugHandler.WriteToDebugScreenTexture(cameraData.resolveFinalTarget))
|| cameraData.captureActions != null;
|| cameraData.captureActions != null
|| hasVolumetricShadowPass;

return inputSummary;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1994,7 +1994,7 @@ public TextureHandle RenderLensFlareScreenSpace(RenderGraph renderGraph, Camera

#endregion

static private void ScaleViewport(RasterCommandBuffer cmd, RTHandle sourceTextureHdl, RTHandle dest, UniversalCameraData cameraData, bool hasFinalPass)
static private void ScaleViewport(RasterCommandBuffer cmd, RTHandle sourceTextureHdl, RTHandle dest, UniversalCameraData cameraData, bool isActiveTargetBackBuffer)
{
RenderTargetIdentifier cameraTarget = BuiltinRenderTextureType.CameraTarget;
#if ENABLE_VR && ENABLE_XR_MODULE
Expand All @@ -2003,7 +2003,7 @@ static private void ScaleViewport(RasterCommandBuffer cmd, RTHandle sourceTextur
#endif
if (dest.nameID == cameraTarget || cameraData.targetTexture != null)
{
if (hasFinalPass || !cameraData.resolveFinalTarget)
if (!isActiveTargetBackBuffer)
{
// Inside the camera stack the target is the shared intermediate target, which can be scaled with render scale.
// camera.pixelRect is the viewport of the final target in pixels, so it cannot be used for the intermediate target.
Expand All @@ -2027,19 +2027,19 @@ static private void ScaleViewport(RasterCommandBuffer cmd, RTHandle sourceTextur
}
}

static private void ScaleViewportAndBlit(in RasterGraphContext context, in TextureHandle source, in TextureHandle destination, UniversalCameraData cameraData, Material material, bool hasFinalPass)
static private void ScaleViewportAndBlit(in RasterGraphContext context, in TextureHandle source, in TextureHandle destination, UniversalCameraData cameraData, Material material, bool isActiveTargetBackBuffer)
{
Vector4 scaleBias = RenderingUtils.GetFinalBlitScaleBias(in context, in source, in destination);
ScaleViewport(context.cmd, source, destination, cameraData, hasFinalPass);
ScaleViewport(context.cmd, source, destination, cameraData, isActiveTargetBackBuffer);

Blitter.BlitTexture(context.cmd, source, scaleBias, material, 0);
}

static private void ScaleViewportAndDrawVisibilityMesh(in RasterGraphContext context, in TextureHandle source, in TextureHandle destination, UniversalCameraData cameraData, Material material, bool hasFinalPass)
static private void ScaleViewportAndDrawVisibilityMesh(in RasterGraphContext context, in TextureHandle source, in TextureHandle destination, UniversalCameraData cameraData, Material material, bool isActiveTargetBackBuffer)
{
#if ENABLE_VR && ENABLE_XR_MODULE
Vector4 scaleBias = RenderingUtils.GetFinalBlitScaleBias(in context, in source, in destination);
ScaleViewport(context.cmd, source, destination, cameraData, hasFinalPass);
ScaleViewport(context.cmd, source, destination, cameraData, isActiveTargetBackBuffer);

// Set property block for blit shader
MaterialPropertyBlock xrPropertyBlock = XRSystemUniversal.GetMaterialPropertyBlock();
Expand All @@ -2056,9 +2056,10 @@ private class PostProcessingFinalSetupPassData
internal TextureHandle sourceTexture;
internal Material material;
internal UniversalCameraData cameraData;
internal bool isActiveTargetBackBuffer;
}

public void RenderFinalSetup(RenderGraph renderGraph, UniversalCameraData cameraData, in TextureHandle source, in TextureHandle destination, ref FinalBlitSettings settings)
public void RenderFinalSetup(RenderGraph renderGraph, UniversalCameraData cameraData, in TextureHandle source, in TextureHandle destination, ref FinalBlitSettings settings, bool isActiveTargetBackBuffer)
{
// Scaled FXAA
using (var builder = renderGraph.AddRasterRenderPass<PostProcessingFinalSetupPassData>("Postprocessing Final Setup Pass", out var passData, ProfilingSampler.Get(URPProfileId.RG_FinalSetup)))
Expand Down Expand Up @@ -2090,15 +2091,15 @@ public void RenderFinalSetup(RenderGraph renderGraph, UniversalCameraData camera
builder.UseTexture(source, AccessFlags.Read);
passData.cameraData = cameraData;
passData.material = material;
passData.isActiveTargetBackBuffer = isActiveTargetBackBuffer;

builder.SetRenderFunc(static (PostProcessingFinalSetupPassData data, RasterGraphContext context) =>
{
RTHandle sourceTextureHdl = data.sourceTexture;

PostProcessUtils.SetSourceSize(context.cmd, sourceTextureHdl);

bool hasFinalPass = true; // This is a pass just before final pass. Viewport must match intermediate target.
ScaleViewportAndBlit(in context, in data.sourceTexture, in data.destinationTexture, data.cameraData, data.material, hasFinalPass);
ScaleViewportAndBlit(in context, in data.sourceTexture, in data.destinationTexture, data.cameraData, data.material, data.isActiveTargetBackBuffer);
});
return;
}
Expand Down Expand Up @@ -2292,6 +2293,7 @@ public void RenderFinalPassRenderGraph(RenderGraph renderGraph, ContextContainer
m_FilmGrain = stack.GetComponent<FilmGrain>();

UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
UniversalResourceData resourceData = frameData.Get<UniversalResourceData>();

var material = m_Materials.finalPass;

Expand Down Expand Up @@ -2394,7 +2396,7 @@ public void RenderFinalPassRenderGraph(RenderGraph renderGraph, ContextContainer
// When FXAA is needed while scaling is active, we must perform it before the scaling takes place.
if (isSetupRequired)
{
RenderFinalSetup(renderGraph, cameraData, in currentSource, in scalingSetupTarget, ref settings);
RenderFinalSetup(renderGraph, cameraData, in currentSource, in scalingSetupTarget, ref settings, resourceData.isActiveTargetBackBuffer);
currentSource = scalingSetupTarget;

// Indicate that we no longer need to perform FXAA in the final pass since it was already perfomed here.
Expand Down Expand Up @@ -2464,7 +2466,7 @@ private class UberPostPassData
internal bool isHdrGrading;
internal bool isBackbuffer;
internal bool enableAlphaOutput;
internal bool hasFinalPass;
internal bool isActiveTargetBackBuffer;
}

TextureHandle TryGetCachedUserLutTextureHandle(RenderGraph renderGraph)
Expand All @@ -2490,7 +2492,7 @@ TextureHandle TryGetCachedUserLutTextureHandle(RenderGraph renderGraph)

public void RenderUberPost(RenderGraph renderGraph, ContextContainer frameData, UniversalCameraData cameraData, UniversalPostProcessingData postProcessingData,
in TextureHandle sourceTexture, in TextureHandle destTexture, in TextureHandle lutTexture, in TextureHandle bloomTexture, in TextureHandle overlayUITexture,
bool requireHDROutput, bool enableAlphaOutput, bool hasFinalPass)
bool requireHDROutput, bool enableAlphaOutput)
{
var material = m_Materials.uber;
bool hdrGrading = postProcessingData.gradingMode == ColorGradingMode.HighDynamicRange;
Expand Down Expand Up @@ -2550,7 +2552,7 @@ public void RenderUberPost(RenderGraph renderGraph, ContextContainer frameData,
passData.toneMappingMode = m_Tonemapping.mode.value;
passData.isHdrGrading = hdrGrading;
passData.enableAlphaOutput = enableAlphaOutput;
passData.hasFinalPass = hasFinalPass;
passData.isActiveTargetBackBuffer = resourceData.isActiveTargetBackBuffer;

builder.SetRenderFunc(static (UberPostPassData data, RasterGraphContext context) =>
{
Expand Down Expand Up @@ -2587,10 +2589,10 @@ public void RenderUberPost(RenderGraph renderGraph, ContextContainer frameData,
// Done with Uber, blit it
#if ENABLE_VR && ENABLE_XR_MODULE
if (data.cameraData.xr.enabled && data.cameraData.xr.hasValidVisibleMesh)
ScaleViewportAndDrawVisibilityMesh(in context, in data.sourceTexture, in data.destinationTexture, data.cameraData, material, data.hasFinalPass);
ScaleViewportAndDrawVisibilityMesh(in context, in data.sourceTexture, in data.destinationTexture, data.cameraData, material, data.isActiveTargetBackBuffer);
else
#endif
ScaleViewportAndBlit(in context, in data.sourceTexture, in data.destinationTexture, data.cameraData, material, data.hasFinalPass);
ScaleViewportAndBlit(in context, in data.sourceTexture, in data.destinationTexture, data.cameraData, material, data.isActiveTargetBackBuffer);

});

Expand Down Expand Up @@ -2896,15 +2898,15 @@ public void RenderPostProcessingRenderGraph(RenderGraph renderGraph, ContextCont
HDROutputUtils.Operation hdrOperations = !m_HasFinalPass && m_EnableColorEncodingIfNeeded ? HDROutputUtils.Operation.ColorEncoding : HDROutputUtils.Operation.None;

SetupHDROutput(cameraData.hdrDisplayInformation, cameraData.hdrDisplayColorGamut, m_Materials.uber, hdrOperations, cameraData.rendersOverlayUI);
RenderingUtils.SetupOffscreenUIViewportParams(m_Materials.uber, ref cameraData.pixelRect, !m_HasFinalPass && cameraData.resolveFinalTarget);
RenderingUtils.SetupOffscreenUIViewportParams(m_Materials.uber, ref cameraData.pixelRect, resourceData.isActiveTargetBackBuffer);
}

bool enableAlphaOutput = cameraData.isAlphaOutputEnabled;

DebugHandler debugHandler = ScriptableRenderPass.GetActiveDebugHandler(cameraData);
debugHandler?.UpdateShaderGlobalPropertiesForFinalValidationPass(renderGraph, cameraData, !m_HasFinalPass && !resolveToDebugScreen);

RenderUberPost(renderGraph, frameData, cameraData, postProcessingData, in currentSource, in postProcessingTarget, in lutTexture, in bloomTexture, in overlayUITexture, requireHDROutput, enableAlphaOutput, hasFinalPass);
RenderUberPost(renderGraph, frameData, cameraData, postProcessingData, in currentSource, in postProcessingTarget, in lutTexture, in bloomTexture, in overlayUITexture, requireHDROutput, enableAlphaOutput);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,10 @@ void SetPerCameraShaderVariables(RasterCommandBuffer cmd, UniversalCameraData ca
cameraHeight = (float)cameraTargetSizeCopy.y;

useRenderPassEnabled = false;

// Multi-pass needs to set unity_StereoEyeIndex builtin param for skybox-panoramic.shader to work correctly (UUM-120719)
if (!cameraData.xr.singlePassEnabled)
cmd.SetGlobalVector(XRBuiltinShaderConstants.unity_StereoEyeIndex, new Vector4(cameraData.xr.multipassId, 0, 0, 0));
}

if (camera.allowDynamicResolution)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1421,6 +1421,9 @@ private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing)
if (isTargetBackbuffer)
{
target = backbuffer;

// Switch target to backbuffer for post processing pass
resourceData.SwitchActiveTexturesToBackbuffer();
}
else
{
Expand Down Expand Up @@ -1475,11 +1478,6 @@ private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing)
// Handle any after-post rendering debugger overlays
if (cameraData.resolveFinalTarget)
SetupAfterPostRenderGraphFinalPassDebug(renderGraph, frameData);

if (isTargetBackbuffer)
{
resourceData.SwitchActiveTexturesToBackbuffer();
}
}

RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent.AfterRenderingPostProcessing);
Expand Down Expand Up @@ -2014,7 +2012,12 @@ void CreateOffscreenUITexture(RenderGraph renderGraph, TextureDesc descriptor)
UniversalResourceData resourceData = frameData.Get<UniversalResourceData>();
DrawScreenSpaceUIPass.ConfigureOffscreenUITextureDesc(ref descriptor);
RenderingUtils.ReAllocateHandleIfNeeded(ref m_OffscreenUIColorHandle, descriptor, name: "_OverlayUITexture");
resourceData.overlayUITexture = renderGraph.ImportTexture(m_OffscreenUIColorHandle);
// Clear the texture to avoid stale data from previous frames
ImportResourceParams importParams = new ImportResourceParams();
importParams.clearOnFirstUse = true;
importParams.clearColor = Color.clear;
importParams.discardOnLastUse = true;
resourceData.overlayUITexture = renderGraph.ImportTexture(m_OffscreenUIColorHandle, importParams);
}

void DepthNormalPrepassRender(RenderGraph renderGraph, RenderPassInputSummary renderPassInputs, in TextureHandle depthTarget, uint batchLayerMask, bool setGlobalDepth, bool setGlobalTextures, bool partialPass)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,8 @@
if(intensity < 1)\
{\
half4 shadowTex = SAMPLE_TEXTURE2D(_ShadowTex, sampler_ShadowTex, input.shadowUV); \
half4 shadowIntensity = 1-max(shadowTex.r, shadowTex.g * 1-shadowTex.b);\
color.rgb = (color.rgb * shadowIntensity.rgb) + (color.rgb * intensity*(1 - shadowIntensity.rgb));\
half shadowIntensity = 1 - max(shadowTex.r, shadowTex.g * (1 - shadowTex.b));\
color.rgb = (color.rgb * shadowIntensity) + (color.rgb * intensity * (1 - shadowIntensity));\
}

#define TRANSFER_SHADOWS(output)\
Expand Down
Loading
Loading