render stencil portals (transparent)

This commit is contained in:
2023-03-08 15:39:58 +01:00
parent 02bb0727b7
commit 4be8380a40
14 changed files with 475 additions and 60 deletions

View File

@@ -0,0 +1,30 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: PortalDepth
m_Shader: {fileID: 4800000, guid: 9c438221637f2c0439e5af0dadf1f829, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs: []
m_Ints: []
m_Floats:
- _PortalNumber: 0
m_Colors: []
m_BuildTextureStacks: []

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b788aaf4ec13aab459f370617052b5c1
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,12 @@
Shader "Escape Room Engine/PortalDepth" {
SubShader {
Pass {
ColorMask 0
Stencil {
Ref 1
Comp LEqual
}
}
}
}

View File

@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 9c438221637f2c0439e5af0dadf1f829
ShaderImporter:
externalObjects: {}
defaultTextures: []
nonModifiableTextures: []
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -12,7 +12,7 @@ GameObject:
- component: {fileID: 8547629936759508216}
- component: {fileID: 5871497001431693362}
m_Layer: 7
m_Name: Portal Screen
m_Name: Screen
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -25,14 +25,14 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5366957160841664999}
m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071067}
m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2246995198243242195}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0}
--- !u!33 &8547629936759508216
MeshFilter:
m_ObjectHideFlags: 0
@@ -134,7 +134,6 @@ MonoBehaviour:
linkedPortal: {fileID: 0}
minNearClipPlane: 0.0001
screen: {fileID: 5871497001431693362}
cameraTransform: {fileID: 0}
portalTransform: {fileID: 2246995198243242195}
--- !u!65 &7604291350124895408
BoxCollider:
@@ -182,14 +181,14 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8470391359842711396}
m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071067}
m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2246995198243242195}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0}
--- !u!33 &5289736326143877755
MeshFilter:
m_ObjectHideFlags: 0

View File

@@ -0,0 +1,55 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
namespace EscapeRoomEngine.Portal.Runtime
{
public class FullScreenDepth : ScriptableRendererFeature
{
private class RenderPass : ScriptableRenderPass
{
private RenderStateBlock _renderStateBlock;
private readonly LayerMask _layer;
public RenderPass(LayerMask layer, RenderPassEvent renderPassEvent)
{
_layer = layer;
this.renderPassEvent = renderPassEvent;
_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);
var filteringSettings = new FilteringSettings(RenderQueueRange.opaque, _layer);
context.DrawRenderers(renderingData.cullResults, ref drawingSettings, ref filteringSettings, ref _renderStateBlock);
}
}
private RenderPass _renderPass;
public LayerMask layer;
public RenderPassEvent renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
public override void Create()
{
_renderPass = new RenderPass(layer, renderPassEvent);
}
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
renderer.EnqueuePass(_renderPass);
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 7ace2de170db48acb344b9e43cb6524e
timeCreated: 1682972259

View File

@@ -26,9 +26,10 @@ namespace EscapeRoomEngine.Portal.Runtime
/// </summary>
public float minNearClipPlane = 0.0001f;
/// <summary>
/// The mesh where the portal will be drawn.
/// The meshes where the portal will draw its stencil and depth.
/// </summary>
[BoxGroup("Internal")] public MeshRenderer screen;
[BoxGroup("Internal")] [SerializeField]
private MeshRenderer screen;
/// <summary>
/// The transform marking the edge of the portal plane.
/// </summary>

View File

@@ -32,7 +32,7 @@ namespace EscapeRoomEngine.Portal.Runtime
_layers = layers;
_passType = passType;
renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
renderPassEvent = passType == PassType.Opaque ? RenderPassEvent.AfterRenderingOpaques : RenderPassEvent.BeforeRenderingTransparents;
_renderStateBlock = new RenderStateBlock(RenderStateMask.Nothing);
// set stencil
@@ -107,7 +107,7 @@ namespace EscapeRoomEngine.Portal.Runtime
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
renderer.EnqueuePass(_opaquePass);
// renderer.EnqueuePass(_transparentPass); TODO: enable
renderer.EnqueuePass(_transparentPass);
}
}
}

View File

@@ -7,17 +7,19 @@ namespace EscapeRoomEngine.Portal.Runtime
{
public class RenderPortals : ScriptableRendererFeature
{
private class PortalRenderPass : ScriptableRenderPass
private class RenderPass : ScriptableRenderPass
{
private RenderStateBlock _renderStateBlock;
private readonly LayerMask _layers;
private readonly LayerMask _layer;
private readonly Material _overwriteMaterial;
public PortalRenderPass(LayerMask layers)
public RenderPass(LayerMask layer, Material overwriteMaterial, RenderPassEvent renderPassEvent)
{
_layers = layers;
_layer = layer;
_overwriteMaterial = overwriteMaterial;
renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
this.renderPassEvent = renderPassEvent;
_renderStateBlock = new RenderStateBlock(RenderStateMask.Nothing);
}
@@ -31,24 +33,30 @@ namespace EscapeRoomEngine.Portal.Runtime
new("SRPDefaultUnlit"), new("UniversalForward"), new("UniversalForwardOnly")
},
ref renderingData, sortingCriteria);
if (_overwriteMaterial)
{
drawingSettings.overrideMaterial = _overwriteMaterial;
}
var filteringSettings = new FilteringSettings(RenderQueueRange.opaque, _layers);
var filteringSettings = new FilteringSettings(RenderQueueRange.opaque, _layer);
context.DrawRenderers(renderingData.cullResults, ref drawingSettings, ref filteringSettings, ref _renderStateBlock);
}
}
private PortalRenderPass _portalPass;
private RenderPass _renderPass;
public LayerMask layers;
public LayerMask layer;
public Material overwriteMaterial;
public RenderPassEvent renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
public override void Create()
{
_portalPass = new PortalRenderPass(layers);
_renderPass = new RenderPass(layer, overwriteMaterial, renderPassEvent);
}
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
renderer.EnqueuePass(_portalPass);
renderer.EnqueuePass(_renderPass);
}
}
}