render stencil portals (transparent)
This commit is contained in:
30
Assets/Portal/Assets/Materials/PortalDepth.mat
Normal file
30
Assets/Portal/Assets/Materials/PortalDepth.mat
Normal 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: []
|
||||
8
Assets/Portal/Assets/Materials/PortalDepth.mat.meta
Normal file
8
Assets/Portal/Assets/Materials/PortalDepth.mat.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b788aaf4ec13aab459f370617052b5c1
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
12
Assets/Portal/Assets/Materials/PortalDepth.shader
Normal file
12
Assets/Portal/Assets/Materials/PortalDepth.shader
Normal file
@@ -0,0 +1,12 @@
|
||||
Shader "Escape Room Engine/PortalDepth" {
|
||||
SubShader {
|
||||
Pass {
|
||||
ColorMask 0
|
||||
|
||||
Stencil {
|
||||
Ref 1
|
||||
Comp LEqual
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
9
Assets/Portal/Assets/Materials/PortalDepth.shader.meta
Normal file
9
Assets/Portal/Assets/Materials/PortalDepth.shader.meta
Normal file
@@ -0,0 +1,9 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9c438221637f2c0439e5af0dadf1f829
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
nonModifiableTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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
|
||||
|
||||
55
Assets/Portal/Runtime/FullScreenDepth.cs
Normal file
55
Assets/Portal/Runtime/FullScreenDepth.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
3
Assets/Portal/Runtime/FullScreenDepth.cs.meta
Normal file
3
Assets/Portal/Runtime/FullScreenDepth.cs.meta
Normal file
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7ace2de170db48acb344b9e43cb6524e
|
||||
timeCreated: 1682972259
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user