stencil portals pass 1 and 2

This commit is contained in:
2023-02-14 11:22:01 +01:00
parent b2c509e9cb
commit 8aa329a055
18 changed files with 2868 additions and 6 deletions

View File

@@ -0,0 +1,66 @@
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
namespace EscapeRoomEngine.Portal.Runtime
{
public class RenderPortals : ScriptableRendererFeature
{
private class PortalRenderPass : ScriptableRenderPass
{
private RenderStateBlock _renderStateBlock;
private readonly Settings _settings;
public PortalRenderPass(Settings settings)
{
_settings = settings;
renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
_renderStateBlock = new RenderStateBlock(RenderStateMask.Nothing);
}
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
var sortingCriteria = renderingData.cameraData.defaultOpaqueSortFlags;
var drawingSettings =
CreateDrawingSettings(
new List<ShaderTagId>
{
new("SRPDefaultUnlit"), new("UniversalForward"), new("UniversalForwardOnly")
},
ref renderingData, sortingCriteria);
// set stencil to portal
var filteringSettings = new FilteringSettings(RenderQueueRange.opaque, _settings.layer);
drawingSettings.overrideMaterial = _settings.material;
context.DrawRenderers(renderingData.cullResults, ref drawingSettings, ref filteringSettings, ref _renderStateBlock);
}
}
private PortalRenderPass _portalPass;
[Serializable]
public class Settings
{
public LayerMask layer;
public Material material;
}
public Settings settings = new();
public override void Create()
{
_portalPass = new PortalRenderPass(settings);
}
// Here you can inject one or multiple render passes in the renderer.
// This method is called when setting up the renderer once per-camera.
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
renderer.EnqueuePass(_portalPass);
}
}
}