// This method is called before executing the render pass. // It can be used to configure render targets and their clear state. Also to create temporary render target textures. // When empty this render pass will render to the active camera render target. // You should never call CommandBuffer.SetRenderTarget. Instead call <c>ConfigureTarget</c> and <c>ConfigureClear</c>. // The render pipeline will ensure target setup and clearing happens in an performance manner. public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) { cmd.GetTemporaryRT(depthAttachmentHandle.id, descriptor, FilterMode.Point); ConfigureTarget(depthAttachmentHandle.Identifier()); ConfigureClear(ClearFlag.All, Color.black); }
// Here you can implement the rendering logic. // Use <c>ScriptableRenderContext</c> to issue drawing commands or execute command buffers // https://docs.unity3d.com/ScriptReference/Rendering.ScriptableRenderContext.html // You don't have to call ScriptableRenderContext.submit, the render pipeline will call it at specific points in the pipeline. public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { CommandBuffer cmd = CommandBufferPool.Get(m_ProfilerTag);
using (new ProfilingScope(cmd, new ProfilingSampler( m_ProfilerTag))) { context.ExecuteCommandBuffer(cmd); cmd.Clear();
var sortFlags = renderingData.cameraData.defaultOpaqueSortFlags; var drawSettings = CreateDrawingSettings(m_ShaderTagId, ref renderingData, sortFlags); drawSettings.perObjectData = PerObjectData.None;
ref CameraData cameraData = ref renderingData.cameraData; Camera camera = cameraData.camera; if (cameraData.isStereoEnabled) context.StartMultiEye(camera);
/// Cleanup any allocated resources that were created during the execution of this render pass. public override void FrameCleanup(CommandBuffer cmd) { if (depthAttachmentHandle != RenderTargetHandle.CameraTarget) { cmd.ReleaseTemporaryRT(depthAttachmentHandle.id); depthAttachmentHandle = RenderTargetHandle.CameraTarget; } } }
DepthNormalsPass depthNormalsPass; RenderTargetHandle depthNormalsTexture; Material depthNormalsMaterial;
public override void Create() { depthNormalsMaterial = CoreUtils.CreateEngineMaterial("Hidden/Internal-DepthNormalsTexture"); depthNormalsPass = new DepthNormalsPass(RenderQueueRange.opaque, -1, depthNormalsMaterial); depthNormalsPass.renderPassEvent = RenderPassEvent.AfterRenderingPrePasses; depthNormalsTexture.Init("_CameraDepthNormalsTexture"); }
// 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) { depthNormalsPass.Setup(renderingData.cameraData.cameraTargetDescriptor, depthNormalsTexture); renderer.EnqueuePass(depthNormalsPass); } }
using System.Collections; using System.Collections.Generic; using UnityEngine; using System; namespace UnityEngine.Rendering.Universal { [Serializable, VolumeComponentMenu("Reflection/ScreenSpaceReflection(forward)")] public class ScreenSpaceReflection : VolumeComponent, IPostProcessComponent { public BoolParameter isActive=new BoolParameter(false, false); public FloatParameter MaxStep = new FloatParameter(10,false ); public FloatParameter StepSize = new FloatParameter(1, false); public FloatParameter MaxDistance = new FloatParameter(10, false); public FloatParameter Thickness = new FloatParameter(1, false); public bool IsActive() { return isActive.value; }
public bool IsTileCompatible() { return false; } }
using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; using System; public class SSRRenderPassFeature : ScriptableRendererFeature {
public Material ssrMtl; class CustomRenderPass : ScriptableRenderPass { Material ssrMtl; ScreenSpaceReflection ssr; RenderTextureDescriptor descriptor; RenderTargetHandle ssr_handle; RenderTargetIdentifier source;
const string ssr_tag = "Screen Space Reflection Pass"; ShaderTagId shader_tag = new ShaderTagId("UniversalForward");
public void Setup(RenderTargetIdentifier source) { this.source = source; } public CustomRenderPass(Material ssrMtl,RenderTargetHandle ssr_handle) { this.ssr_handle = ssr_handle; this.ssrMtl = ssrMtl; var stack = VolumeManager.instance.stack; ssr = stack.GetComponent<ScreenSpaceReflection>(); } public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) { descriptor = cameraTextureDescriptor; cmd.GetTemporaryRT(ssr_handle.id, descriptor,FilterMode.Bilinear); ConfigureTarget(ssr_handle.Identifier()); ConfigureClear(ClearFlag.All, Color.black); }
using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; using System; using System.Collections; using System.Collections.Generic;
public class SSRRenderPassFeature : ScriptableRendererFeature {
public Material ssrMtl; class CustomRenderPass : ScriptableRenderPass { Material ssrMtl; ScreenSpaceReflection ssr; RenderTextureDescriptor descriptor; RenderTargetHandle ssr_handle; RenderTargetIdentifier source;
int[] downSampleID; int[] upSampleID; const string ssr_tag = "Screen Space Reflection Pass"; ShaderTagId shader_tag = new ShaderTagId("UniversalForward");
public void Setup(RenderTargetIdentifier source) { this.source = source; } public CustomRenderPass(Material ssrMtl,RenderTargetHandle ssr_handle) { this.ssr_handle = ssr_handle; this.ssrMtl = ssrMtl; var stack = VolumeManager.instance.stack; ssr = stack.GetComponent<ScreenSpaceReflection>(); } public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) { descriptor = cameraTextureDescriptor; cmd.GetTemporaryRT(ssr_handle.id, descriptor,FilterMode.Bilinear); ConfigureTarget(ssr_handle.Identifier()); ConfigureClear(ClearFlag.All, Color.black); }
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { if(ssr!=null&&ssr.isActive.value) { CommandBuffer cmd = CommandBufferPool.Get(ssr_tag); using(new ProfilingScope(cmd,new ProfilingSampler( ssr_tag))) { //ssr cmd.Blit(source, ssr_handle.Identifier(), ssrMtl,0); cmd.SetGlobalTexture("_SSRTexture", ssr_handle.Identifier()); ssrMtl.SetFloat("_MaxStep", ssr.MaxStep.value); ssrMtl.SetFloat("_StepSize", ssr.StepSize.value); ssrMtl.SetFloat("_MaxDistance", ssr.MaxDistance.value); ssrMtl.SetFloat("_Thickness", ssr.Thickness.value); ssrMtl.SetFloat("_Offset",ssr.Radius.value); //dual-kawase int PixelWidth = (int)(descriptor.width / ssr.DownSample.value); int PixelHeight = (int)(descriptor.width / ssr.DownSample.value); downSampleID = new int[16]; upSampleID = new int[16]; for (int i = 0; i < ssr.Iteration.value; ++i) { downSampleID[i] = Shader.PropertyToID("_DownSample" + i); upSampleID[i] = Shader.PropertyToID("_UpSample" + i); } RenderTargetIdentifier temp = ssr_handle.Identifier(); for (int i=0;i<ssr.Iteration.value;++i) {