stencil portals pass 1 and 2
This commit is contained in:
66
Assets/Portal/Runtime/RenderPortals.cs
Normal file
66
Assets/Portal/Runtime/RenderPortals.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user