-
-
Save unitycoder/30de10bb7608625afacac8031c672a59 to your computer and use it in GitHub Desktop.
Unity URP sample -RenderObjects's RenderPass
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Collections.Generic; | |
using UnityEngine.Rendering.Universal; | |
using UnityEngine.Rendering; | |
using UnityEngine.Scripting.APIUpdating; | |
namespace UnityEngine.Experimental.Rendering.Universal | |
{ | |
[MovedFrom("UnityEngine.Experimental.Rendering.LWRP")] public class RenderObjectsPass : ScriptableRenderPass | |
{ | |
RenderQueueType renderQueueType; | |
FilteringSettings m_FilteringSettings; | |
RenderObjects.CustomCameraSettings m_CameraSettings; | |
string m_ProfilerTag; | |
ProfilingSampler m_ProfilingSampler; | |
public Material overrideMaterial { get; set; } | |
public int overrideMaterialPassIndex { get; set; } | |
List<ShaderTagId> m_ShaderTagIdList = new List<ShaderTagId>(); | |
public void SetDetphState(bool writeEnabled, CompareFunction function = CompareFunction.Less) | |
{ | |
m_RenderStateBlock.mask |= RenderStateMask.Depth; | |
m_RenderStateBlock.depthState = new DepthState(writeEnabled, function); | |
} | |
public void SetStencilState(int reference, CompareFunction compareFunction, StencilOp passOp, StencilOp failOp, StencilOp zFailOp) | |
{ | |
StencilState stencilState = StencilState.defaultValue; | |
stencilState.enabled = true; | |
stencilState.SetCompareFunction(compareFunction); | |
stencilState.SetPassOperation(passOp); | |
stencilState.SetFailOperation(failOp); | |
stencilState.SetZFailOperation(zFailOp); | |
m_RenderStateBlock.mask |= RenderStateMask.Stencil; | |
m_RenderStateBlock.stencilReference = reference; | |
m_RenderStateBlock.stencilState = stencilState; | |
} | |
RenderStateBlock m_RenderStateBlock; | |
public RenderObjectsPass(string profilerTag, RenderPassEvent renderPassEvent, string[] shaderTags, RenderQueueType renderQueueType, int layerMask, RenderObjects.CustomCameraSettings cameraSettings) | |
{ | |
m_ProfilerTag = profilerTag; | |
m_ProfilingSampler = new ProfilingSampler(profilerTag); | |
this.renderPassEvent = renderPassEvent; | |
this.renderQueueType = renderQueueType; | |
this.overrideMaterial = null; | |
this.overrideMaterialPassIndex = 0; | |
RenderQueueRange renderQueueRange = (renderQueueType == RenderQueueType.Transparent) | |
? RenderQueueRange.transparent | |
: RenderQueueRange.opaque; | |
m_FilteringSettings = new FilteringSettings(renderQueueRange, layerMask); | |
if (shaderTags != null && shaderTags.Length > 0) | |
{ | |
foreach (var passName in shaderTags) | |
m_ShaderTagIdList.Add(new ShaderTagId(passName)); | |
} | |
else | |
{ | |
m_ShaderTagIdList.Add(new ShaderTagId("UniversalForward")); | |
m_ShaderTagIdList.Add(new ShaderTagId("LightweightForward")); | |
m_ShaderTagIdList.Add(new ShaderTagId("SRPDefaultUnlit")); | |
} | |
m_RenderStateBlock = new RenderStateBlock(RenderStateMask.Nothing); | |
m_CameraSettings = cameraSettings; | |
} | |
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) | |
{ | |
SortingCriteria sortingCriteria = (renderQueueType == RenderQueueType.Transparent) | |
? SortingCriteria.CommonTransparent | |
: renderingData.cameraData.defaultOpaqueSortFlags; | |
DrawingSettings drawingSettings = CreateDrawingSettings(m_ShaderTagIdList, ref renderingData, sortingCriteria); | |
drawingSettings.overrideMaterial = overrideMaterial; | |
drawingSettings.overrideMaterialPassIndex = overrideMaterialPassIndex; | |
ref CameraData cameraData = ref renderingData.cameraData; | |
Camera camera = cameraData.camera; | |
// In case of camera stacking we need to take the viewport rect from base camera | |
Rect pixelRect = renderingData.cameraData.pixelRect; | |
float cameraAspect = (float) pixelRect.width / (float) pixelRect.height; | |
CommandBuffer cmd = CommandBufferPool.Get(m_ProfilerTag); | |
using (new ProfilingScope(cmd, m_ProfilingSampler)) | |
{ | |
context.ExecuteCommandBuffer(cmd); | |
cmd.Clear(); | |
if (m_CameraSettings.overrideCamera) | |
{ | |
Matrix4x4 projectionMatrix = Matrix4x4.Perspective(m_CameraSettings.cameraFieldOfView, cameraAspect, | |
camera.nearClipPlane, camera.farClipPlane); | |
Matrix4x4 viewMatrix = camera.worldToCameraMatrix; | |
Vector4 cameraTranslation = viewMatrix.GetColumn(3); | |
viewMatrix.SetColumn(3, cameraTranslation + m_CameraSettings.offset); | |
cmd.SetViewProjectionMatrices(viewMatrix, projectionMatrix); | |
context.ExecuteCommandBuffer(cmd); | |
} | |
context.DrawRenderers(renderingData.cullResults, ref drawingSettings, ref m_FilteringSettings, | |
ref m_RenderStateBlock); | |
if (m_CameraSettings.overrideCamera && m_CameraSettings.restoreCamera) | |
{ | |
cmd.Clear(); | |
cmd.SetViewProjectionMatrices(cameraData.viewMatrix, cameraData.projectionMatrix); | |
} | |
} | |
context.ExecuteCommandBuffer(cmd); | |
CommandBufferPool.Release(cmd); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment