fix stencil pass

This commit is contained in:
2023-02-14 17:03:12 +01:00
parent da1837f00c
commit dd080ef541
8 changed files with 86 additions and 75 deletions

View File

@@ -1,21 +1,16 @@
Shader "Escape Room Engine/FullScreenDepth" {
Properties {
_PortalNumber ("Portal Number", Int) = 1
}
Properties {}
SubShader {
Pass
{
Pass {
ColorMask 0
Cull Off
ZWrite On
ZTest Always
Stencil
{
Ref [_PortalNumber]
Comp Equal // pass if equal
Pass Keep // keep stencil value
Fail Keep // keep stencil if depth fails
Stencil {
Ref 1
Comp LEqual
}
CGPROGRAM
@@ -23,18 +18,16 @@
#pragma fragment frag
#include "UnityCG.cginc"
void vert(appdata_img v, out float4 pos : SV_POSITION)
{
#ifdef UNITY_REVERSED_Z
void vert(appdata_img v, out float4 pos : SV_POSITION) {
#ifdef UNITY_REVERSED_Z // clip space [near 1, 0 far]
float far = 0.00001;
#else
#else // clip space [near -1, 1 far]
float far = 0.99999;
#endif
pos = float4(v.vertex.xy * 2.0, far, 1); // quad xy goes from -0.5 to 0.5, clip space from -1 to 1
}
fixed4 frag() : SV_Target
{
fixed4 frag() : SV_Target {
return 0;
}
ENDCG

View File

@@ -25,6 +25,6 @@ Material:
m_TexEnvs: []
m_Ints: []
m_Floats:
- _PortalNumber: 1
- _PortalNumber: 0
m_Colors: []
m_BuildTextureStacks: []

View File

@@ -1,23 +1,13 @@
Shader "Escape Room Engine/PortalStencil"
{
Properties
{
_PortalNumber ("Portal Number", Int) = 1
Shader "Escape Room Engine/PortalStencil" {
Properties {
_PortalNumber ("Portal Number", Int) = 0
}
SubShader
{
Tags
{
"RenderType"="Opaque" "RenderPipeline" = "UniversalPipeline"
}
SubShader {
Pass {
ColorMask 0 // don't draw this to the main framebuffer
Pass
{
ColorMask 0
Stencil
{
Stencil {
Ref [_PortalNumber]
Comp Always // always pass
Pass Replace // set stencil value

View File

@@ -1,5 +1,51 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &2713893991261817724
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2582669991302867501}
- component: {fileID: 7726674486241786965}
m_Layer: 0
m_Name: Camera Transform
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &2582669991302867501
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2713893991261817724}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
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: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &7726674486241786965
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2713893991261817724}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ad60e3973ab83f3468637a06970d7f1f, type: 3}
m_Name:
m_EditorClassIdentifier:
minNearClipPlane: 0.0001
portal: {fileID: 1249363658}
--- !u!1 &5366957160841664999
GameObject:
m_ObjectHideFlags: 0
@@ -61,7 +107,7 @@ MeshRenderer:
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 603cda73335499d4980d9b171eaffe0d, type: 2}
- {fileID: 2100000, guid: f6db0041cc34fe9439de56d5d92c8b8d, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
@@ -116,6 +162,7 @@ Transform:
- {fileID: 4697416823958963037}
- {fileID: 9135323956734471646}
- {fileID: 2398425302420252226}
- {fileID: 2582669991302867501}
m_Father: {fileID: 0}
m_RootOrder: -1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -133,7 +180,8 @@ MonoBehaviour:
m_EditorClassIdentifier:
size: {x: 1, y: 1}
linkedPortal: {fileID: 0}
portalCamera: {fileID: 17691322601746172}
screen: {fileID: 5871497001431693362}
cameraTransform: {fileID: 7726674486241786965}
portalTransform: {fileID: 2246995198243242195}
--- !u!65 &7604291350124895408
BoxCollider:
@@ -174,7 +222,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
m_IsActive: 0
--- !u!4 &2398425302420252226
Transform:
m_ObjectHideFlags: 0
@@ -298,7 +346,6 @@ MonoBehaviour:
m_EditorClassIdentifier:
minNearClipPlane: 0.0001
portal: {fileID: 1249363658}
screen: {fileID: 5871497001431693362}
--- !u!1 &8470391359842711396
GameObject:
m_ObjectHideFlags: 0

View File

@@ -4,6 +4,7 @@ using EscapeRoomEngine.Engine.Runtime.Modules;
using EscapeRoomEngine.Engine.Runtime.Utilities;
using NaughtyAttributes;
using UnityEngine;
using UnityEngine.Serialization;
namespace EscapeRoomEngine.Portal.Runtime
{
@@ -12,9 +13,10 @@ namespace EscapeRoomEngine.Portal.Runtime
/// </summary>
public class Portal : DoorState
{
private static readonly int PortalNumberProperty = Shader.PropertyToID("_PortalNumber");
public static readonly Matrix4x4 HalfRotation = Matrix4x4.Rotate(Quaternion.Euler(0, 180, 0));
private static int _portalCounter;
private static int _portalCounter = 1;
/// <summary>
/// The portal that is connected with this one.
@@ -40,6 +42,7 @@ namespace EscapeRoomEngine.Portal.Runtime
protected virtual void Awake()
{
PortalNumber = _portalCounter++;
screen.material.SetInt(PortalNumberProperty, PortalNumber);
DoorEvent += (_, type) =>
{

View File

@@ -33,9 +33,7 @@ namespace EscapeRoomEngine.Portal.Runtime
},
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);
}
}
@@ -46,7 +44,6 @@ namespace EscapeRoomEngine.Portal.Runtime
public class Settings
{
public LayerMask layer;
public Material material;
}
public Settings settings = new();
@@ -56,8 +53,6 @@ namespace EscapeRoomEngine.Portal.Runtime
_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);