render stencil portals (opaque)
This commit is contained in:
@@ -1,51 +1,5 @@
|
||||
%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
|
||||
@@ -161,8 +115,6 @@ Transform:
|
||||
m_Children:
|
||||
- {fileID: 4697416823958963037}
|
||||
- {fileID: 9135323956734471646}
|
||||
- {fileID: 2398425302420252226}
|
||||
- {fileID: 2582669991302867501}
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: -1
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
@@ -180,8 +132,9 @@ MonoBehaviour:
|
||||
m_EditorClassIdentifier:
|
||||
size: {x: 1, y: 1}
|
||||
linkedPortal: {fileID: 0}
|
||||
minNearClipPlane: 0.0001
|
||||
screen: {fileID: 5871497001431693362}
|
||||
cameraTransform: {fileID: 7726674486241786965}
|
||||
cameraTransform: {fileID: 0}
|
||||
portalTransform: {fileID: 2246995198243242195}
|
||||
--- !u!65 &7604291350124895408
|
||||
BoxCollider:
|
||||
@@ -204,148 +157,6 @@ BoxCollider:
|
||||
serializedVersion: 3
|
||||
m_Size: {x: 1, y: 3, z: 0.3}
|
||||
m_Center: {x: 0, y: 1.5, z: -0.15}
|
||||
--- !u!1 &7398326895463990628
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 2398425302420252226}
|
||||
- component: {fileID: 7791795762741173939}
|
||||
- component: {fileID: 5969531196797302096}
|
||||
- component: {fileID: 17691322601746172}
|
||||
m_Layer: 0
|
||||
m_Name: Camera
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 0
|
||||
--- !u!4 &2398425302420252226
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7398326895463990628}
|
||||
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!20 &7791795762741173939
|
||||
Camera:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7398326895463990628}
|
||||
m_Enabled: 1
|
||||
serializedVersion: 2
|
||||
m_ClearFlags: 1
|
||||
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
|
||||
m_projectionMatrixMode: 1
|
||||
m_GateFitMode: 2
|
||||
m_FOVAxisMode: 0
|
||||
m_Iso: 200
|
||||
m_ShutterSpeed: 0.005
|
||||
m_Aperture: 16
|
||||
m_FocusDistance: 10
|
||||
m_FocalLength: 50
|
||||
m_BladeCount: 5
|
||||
m_Curvature: {x: 2, y: 11}
|
||||
m_BarrelClipping: 0.25
|
||||
m_Anamorphism: 0
|
||||
m_SensorSize: {x: 36, y: 24}
|
||||
m_LensShift: {x: 0, y: 0}
|
||||
m_NormalizedViewPortRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 1
|
||||
height: 1
|
||||
near clip plane: 0.3
|
||||
far clip plane: 1000
|
||||
field of view: 60
|
||||
orthographic: 0
|
||||
orthographic size: 5
|
||||
m_Depth: 0
|
||||
m_CullingMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 4294967295
|
||||
m_RenderingPath: -1
|
||||
m_TargetTexture: {fileID: 0}
|
||||
m_TargetDisplay: 0
|
||||
m_TargetEye: 3
|
||||
m_HDR: 1
|
||||
m_AllowMSAA: 1
|
||||
m_AllowDynamicResolution: 0
|
||||
m_ForceIntoRT: 0
|
||||
m_OcclusionCulling: 1
|
||||
m_StereoConvergence: 10
|
||||
m_StereoSeparation: 0.022
|
||||
--- !u!114 &5969531196797302096
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7398326895463990628}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_RenderShadows: 1
|
||||
m_RequiresDepthTextureOption: 2
|
||||
m_RequiresOpaqueTextureOption: 2
|
||||
m_CameraType: 0
|
||||
m_Cameras: []
|
||||
m_RendererIndex: -1
|
||||
m_VolumeLayerMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 1
|
||||
m_VolumeTrigger: {fileID: 0}
|
||||
m_VolumeFrameworkUpdateModeOption: 2
|
||||
m_RenderPostProcessing: 0
|
||||
m_Antialiasing: 0
|
||||
m_AntialiasingQuality: 2
|
||||
m_StopNaN: 0
|
||||
m_Dithering: 0
|
||||
m_ClearDepth: 1
|
||||
m_AllowXRRendering: 0
|
||||
m_UseScreenCoordOverride: 0
|
||||
m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_RequiresDepthTexture: 0
|
||||
m_RequiresColorTexture: 0
|
||||
m_Version: 2
|
||||
m_TaaSettings:
|
||||
quality: 3
|
||||
frameInfluence: 0.1
|
||||
jitterScale: 1
|
||||
mipBias: 0
|
||||
varianceClampScale: 0.9
|
||||
contrastAdaptiveSharpening: 0
|
||||
--- !u!114 &17691322601746172
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7398326895463990628}
|
||||
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 &8470391359842711396
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
|
||||
@@ -4,7 +4,6 @@ using EscapeRoomEngine.Engine.Runtime.Modules;
|
||||
using EscapeRoomEngine.Engine.Runtime.Utilities;
|
||||
using NaughtyAttributes;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Serialization;
|
||||
|
||||
namespace EscapeRoomEngine.Portal.Runtime
|
||||
{
|
||||
@@ -23,9 +22,13 @@ namespace EscapeRoomEngine.Portal.Runtime
|
||||
/// </summary>
|
||||
public Portal linkedPortal;
|
||||
/// <summary>
|
||||
/// The camera that will draw the view for this portal.
|
||||
/// The minimum near clip plane distance to be used when calculating the oblique clip plane.
|
||||
/// </summary>
|
||||
[BoxGroup("Internal")] public PortalCamera portalCamera;
|
||||
public float minNearClipPlane = 0.0001f;
|
||||
/// <summary>
|
||||
/// The mesh where the portal will be drawn.
|
||||
/// </summary>
|
||||
[BoxGroup("Internal")] public MeshRenderer screen;
|
||||
/// <summary>
|
||||
/// The transform marking the edge of the portal plane.
|
||||
/// </summary>
|
||||
@@ -51,12 +54,10 @@ namespace EscapeRoomEngine.Portal.Runtime
|
||||
{
|
||||
case DoorEventType.Connected:
|
||||
linkedPortal = FromDoorState(Module.ConnectedDoorState);
|
||||
portalCamera.screen.gameObject.SetActive(true);
|
||||
portalCamera.enabled = true;
|
||||
screen.gameObject.SetActive(true);
|
||||
break;
|
||||
case DoorEventType.Locked:
|
||||
portalCamera.enabled = false;
|
||||
portalCamera.screen.gameObject.SetActive(false);
|
||||
screen.gameObject.SetActive(false);
|
||||
linkedPortal = null;
|
||||
break;
|
||||
}
|
||||
@@ -85,6 +86,31 @@ namespace EscapeRoomEngine.Portal.Runtime
|
||||
}
|
||||
}
|
||||
|
||||
public Camera SetUpCamera(Camera playerCamera)
|
||||
{
|
||||
// place camera
|
||||
var m = portalTransform.localToWorldMatrix * HalfRotation *
|
||||
linkedPortal.portalTransform.worldToLocalMatrix * playerCamera.transform.localToWorldMatrix;
|
||||
playerCamera.transform.SetPositionAndRotation(m.GetPosition(), m.rotation);
|
||||
|
||||
// set camera clip plane to portal (otherwise the wall behind the portal would be rendered)
|
||||
// calculating the clip plane: https://computergraphics.stackexchange.com/a/1506
|
||||
// clip plane normal
|
||||
var n = -portalTransform.forward;
|
||||
// clip plane in world space
|
||||
var portalPlane = new Plane(n, portalTransform.position);
|
||||
if (-portalPlane.GetDistanceToPoint(playerCamera.transform.position) >= minNearClipPlane)
|
||||
{
|
||||
// vector format clip plane in camera space
|
||||
var clipPlane = playerCamera.worldToCameraMatrix.inverse.transpose *
|
||||
new Vector4(n.x, n.y, n.z, portalPlane.distance);
|
||||
// only adjust the near clip plane if it doesn't intersect with the camera
|
||||
playerCamera.projectionMatrix = playerCamera.CalculateObliqueMatrix(clipPlane);
|
||||
}
|
||||
|
||||
return playerCamera;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Begin tracking a portal driver that came close to this portal and might need to be teleported.
|
||||
/// </summary>
|
||||
|
||||
@@ -1,105 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using EscapeRoomEngine.VR.Runtime;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering;
|
||||
using UnityEngine.Rendering.Universal;
|
||||
using UnityEngine.XR;
|
||||
|
||||
namespace EscapeRoomEngine.Portal.Runtime
|
||||
{
|
||||
[RequireComponent(typeof(Camera))]
|
||||
public class PortalCamera : MonoBehaviour
|
||||
{
|
||||
private static readonly Camera.StereoscopicEye[] Eyes =
|
||||
{ Camera.StereoscopicEye.Left, Camera.StereoscopicEye.Right };
|
||||
private static readonly Dictionary<Camera.StereoscopicEye, int> EyeTextureNames = new()
|
||||
{
|
||||
{ Camera.StereoscopicEye.Left, Shader.PropertyToID("_LeftTex") },
|
||||
{ Camera.StereoscopicEye.Right, Shader.PropertyToID("_RightTex") }
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// The minimum near clip plane distance to be used when calculating the oblique clip plane.
|
||||
/// </summary>
|
||||
public float minNearClipPlane = 0.0001f;
|
||||
/// <summary>
|
||||
/// The portal this camera renders through.
|
||||
/// </summary>
|
||||
[SerializeField] private Portal portal;
|
||||
/// <summary>
|
||||
/// The mesh where the rendered texture will be drawn on.
|
||||
/// </summary>
|
||||
[SerializeField] public MeshRenderer screen;
|
||||
|
||||
private Camera _camera;
|
||||
private readonly Dictionary<Camera.StereoscopicEye, RenderTexture> _textures = new();
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
// get portal camera
|
||||
_camera = GetComponent<Camera>();
|
||||
}
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
_camera.enabled = true;
|
||||
RenderPipelineManager.beginCameraRendering += Render;
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
RenderPipelineManager.beginCameraRendering -= Render;
|
||||
_camera.enabled = false;
|
||||
}
|
||||
|
||||
private void Render(ScriptableRenderContext scriptableRenderContext, Camera _)
|
||||
{
|
||||
// check whether the portal plane is visible from the player camera
|
||||
var frustumPlanes = GeometryUtility.CalculateFrustumPlanes(Player.Instance.camera);
|
||||
if (!GeometryUtility.TestPlanesAABB(frustumPlanes, portal.linkedPortal.portalCamera.screen.bounds))
|
||||
// don't render this portal if it is not visible
|
||||
return;
|
||||
|
||||
screen.enabled = false;
|
||||
|
||||
foreach (var eye in Eyes)
|
||||
{
|
||||
// create portal texture if it doesn't exist yet
|
||||
if (!_textures.ContainsKey(eye))
|
||||
{
|
||||
if (XRSettings.eyeTextureWidth > 0 && XRSettings.eyeTextureHeight > 0)
|
||||
{
|
||||
_textures.Add(eye,
|
||||
new RenderTexture(XRSettings.eyeTextureWidth, XRSettings.eyeTextureHeight, 24));
|
||||
portal.linkedPortal.portalCamera.screen.material.SetTexture(EyeTextureNames[eye], _textures[eye]);
|
||||
}
|
||||
else // no texture was created so nothing should be rendered
|
||||
continue;
|
||||
}
|
||||
|
||||
// position portal camera
|
||||
var m = portal.portalTransform.localToWorldMatrix * Portal.HalfRotation *
|
||||
portal.linkedPortal.portalTransform.worldToLocalMatrix *
|
||||
Player.Instance.GetEye(eye).localToWorldMatrix;
|
||||
transform.SetPositionAndRotation(m.GetPosition(), m.rotation);
|
||||
_camera.projectionMatrix = Player.Instance.camera.GetStereoProjectionMatrix(eye);
|
||||
|
||||
// set camera clip plane to portal (otherwise the wall behind the portal would be rendered)
|
||||
// calculating the clip plane: https://computergraphics.stackexchange.com/a/1506
|
||||
var n = -portal.portalTransform.forward; // clip plane normal
|
||||
var portalPlane = new Plane(n, portal.portalTransform.position); // clip plane in world space
|
||||
var clipPlane = _camera.worldToCameraMatrix.inverse.transpose *
|
||||
new Vector4(n.x, n.y, n.z, portalPlane.distance); // vector format clip plane in camera space
|
||||
if (-portalPlane.GetDistanceToPoint(transform.position) >= minNearClipPlane)
|
||||
// only adjust the near clip plane if it doesn't intersect with the camera
|
||||
_camera.projectionMatrix = _camera.CalculateObliqueMatrix(clipPlane);
|
||||
|
||||
// render portal view
|
||||
_camera.targetTexture = _textures[eye];
|
||||
UniversalRenderPipeline.RenderSingleCamera(scriptableRenderContext, _camera);
|
||||
}
|
||||
|
||||
screen.enabled = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ad60e3973ab83f3468637a06970d7f1f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
113
Assets/Portal/Runtime/RenderPortalCameras.cs
Normal file
113
Assets/Portal/Runtime/RenderPortalCameras.cs
Normal file
@@ -0,0 +1,113 @@
|
||||
using System.Collections.Generic;
|
||||
using EscapeRoomEngine.VR.Runtime;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering;
|
||||
using UnityEngine.Rendering.Universal;
|
||||
|
||||
namespace EscapeRoomEngine.Portal.Runtime
|
||||
{
|
||||
public class RenderPortalCameras : ScriptableRendererFeature
|
||||
{
|
||||
private enum PassType
|
||||
{
|
||||
Opaque,
|
||||
Transparent
|
||||
}
|
||||
|
||||
private class PortalCameraRenderPass : ScriptableRenderPass
|
||||
{
|
||||
private static readonly List<ShaderTagId> ShaderTagIds = new List<ShaderTagId>
|
||||
{
|
||||
new("SRPDefaultUnlit"), new("UniversalForward"), new("UniversalForwardOnly")
|
||||
};
|
||||
|
||||
private RenderStateBlock _renderStateBlock;
|
||||
private CommandBuffer _commandBuffer;
|
||||
|
||||
private readonly LayerMask _layers;
|
||||
private readonly PassType _passType;
|
||||
|
||||
public PortalCameraRenderPass(LayerMask layers, PassType passType)
|
||||
{
|
||||
_layers = layers;
|
||||
_passType = passType;
|
||||
|
||||
renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
|
||||
_renderStateBlock = new RenderStateBlock(RenderStateMask.Nothing);
|
||||
|
||||
// set stencil
|
||||
var stencilState = StencilState.defaultValue;
|
||||
stencilState.enabled = true;
|
||||
stencilState.SetCompareFunction(CompareFunction.Equal);
|
||||
stencilState.SetPassOperation(StencilOp.Keep);
|
||||
stencilState.SetFailOperation(StencilOp.Keep);
|
||||
stencilState.SetZFailOperation(StencilOp.Keep);
|
||||
_renderStateBlock.mask |= RenderStateMask.Stencil;
|
||||
_renderStateBlock.stencilState = stencilState;
|
||||
}
|
||||
|
||||
public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
|
||||
{
|
||||
// we need to store a reference to the command buffer before executing, because the reference in RenderingData is internal
|
||||
_commandBuffer = cmd;
|
||||
}
|
||||
|
||||
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
|
||||
{
|
||||
if (Player.Instance)
|
||||
{
|
||||
var drawingSettings = CreateDrawingSettings(ShaderTagIds, ref renderingData, _passType == PassType.Opaque ? renderingData.cameraData.defaultOpaqueSortFlags : SortingCriteria.CommonTransparent);
|
||||
var filteringSettings = new FilteringSettings(_passType == PassType.Opaque ? RenderQueueRange.opaque : RenderQueueRange.transparent, _layers);
|
||||
|
||||
foreach (var portal in FindObjectsByType<Portal>(FindObjectsInactive.Exclude, FindObjectsSortMode.None))
|
||||
{
|
||||
var linkedPortal = portal.linkedPortal;
|
||||
if (linkedPortal)
|
||||
{
|
||||
// set which portal to render
|
||||
_renderStateBlock.stencilReference = portal.PortalNumber;
|
||||
|
||||
// prepare the camera
|
||||
ref var cameraData = ref renderingData.cameraData;
|
||||
var camera = cameraData.camera;
|
||||
var cameraTransform = camera.transform;
|
||||
var originalPosition = cameraTransform.position;
|
||||
var originalRotation = cameraTransform.rotation;
|
||||
var originalProjection = camera.projectionMatrix;
|
||||
camera = linkedPortal.SetUpCamera(camera);
|
||||
RenderingUtils.SetViewAndProjectionMatrices(_commandBuffer, camera.worldToCameraMatrix, GL.GetGPUProjectionMatrix(camera.projectionMatrix, true), false);
|
||||
|
||||
// execute command buffer
|
||||
context.ExecuteCommandBuffer(_commandBuffer);
|
||||
_commandBuffer.Clear();
|
||||
|
||||
// render the portal
|
||||
context.DrawRenderers(renderingData.cullResults, ref drawingSettings, ref filteringSettings, ref _renderStateBlock);
|
||||
|
||||
// reset
|
||||
RenderingUtils.SetViewAndProjectionMatrices(_commandBuffer, cameraData.GetViewMatrix(), cameraData.GetGPUProjectionMatrix(), false);
|
||||
camera.transform.SetPositionAndRotation(originalPosition, originalRotation);
|
||||
camera.projectionMatrix = originalProjection;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private PortalCameraRenderPass _opaquePass, _transparentPass;
|
||||
|
||||
public LayerMask layers;
|
||||
|
||||
public override void Create()
|
||||
{
|
||||
_opaquePass = new PortalCameraRenderPass(layers, PassType.Opaque);
|
||||
_transparentPass = new PortalCameraRenderPass(layers, PassType.Transparent);
|
||||
}
|
||||
|
||||
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
|
||||
{
|
||||
renderer.EnqueuePass(_opaquePass);
|
||||
// renderer.EnqueuePass(_transparentPass); TODO: enable
|
||||
}
|
||||
}
|
||||
}
|
||||
3
Assets/Portal/Runtime/RenderPortalCameras.cs.meta
Normal file
3
Assets/Portal/Runtime/RenderPortalCameras.cs.meta
Normal file
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: eaf6ad8627b74652be2715a93378d05f
|
||||
timeCreated: 1682588767
|
||||
Reference in New Issue
Block a user