NB_FX
This commit is contained in:
@@ -0,0 +1,387 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering;
|
||||
using UnityEngine.Rendering.Universal;
|
||||
using System.Collections.Generic;
|
||||
#if UNIVERSAL_RP_17_0_OR_NEWER
|
||||
using UnityEngine.Experimental.Rendering;
|
||||
using UnityEngine.Rendering.RenderGraphModule;
|
||||
using UnityEngine.Rendering.RenderGraphModule.Util;
|
||||
#endif
|
||||
|
||||
namespace NBShader
|
||||
{
|
||||
public class DisturbanceMaskRenderPass : ScriptableRenderPass
|
||||
{
|
||||
private ProfilingSampler _profilingSampler;
|
||||
#if UNIVERSAL_RP_13_1_2_OR_NEWER
|
||||
private RTHandle _DisturbanceMaskRTHandle;
|
||||
private RTHandle _cameraDepthRTHandle;
|
||||
private RTHandle _DownRT;
|
||||
#else
|
||||
private static readonly int _DisturbanceMaskRTID = Shader.PropertyToID("_DisturbanceMaskRT");
|
||||
private static readonly int _DownRTID = Shader.PropertyToID("_DisturbanceMaskTex");
|
||||
private RenderTargetIdentifier _DisturbanceMaskRTHandle = new RenderTargetIdentifier (_DisturbanceMaskRTID);
|
||||
private RenderTargetIdentifier _cameraDepthRTHandle;
|
||||
private RenderTargetIdentifier _DownRT = new RenderTargetIdentifier (_DownRTID);
|
||||
#endif
|
||||
private Material tempMat;
|
||||
|
||||
private readonly Downsampling _downSampling;
|
||||
|
||||
private Material _renderMaskMat ;
|
||||
// public LayerMask _DisturbanceMaskLayer = 1 << 25;
|
||||
private FilteringSettings _Filtering;
|
||||
private static readonly int CameraTexture = Shader.PropertyToID("_CameraTexture");
|
||||
private static readonly int SampleOffset = Shader.PropertyToID("_SampleOffset");
|
||||
private static readonly int DisturbanceMaskTex = Shader.PropertyToID("_DisturbanceMaskTex");
|
||||
private readonly Color _clearDisturbanceMaskColor = new Color(0f, 0f, 0f, 1f);
|
||||
|
||||
private readonly List<ShaderTagId> _shaderTag = new List<ShaderTagId>()
|
||||
{
|
||||
// new ShaderTagId("UniversalForward"),
|
||||
// new ShaderTagId("SRPDefaultUnlit"),
|
||||
// new ShaderTagId("UniversalForwardOnly")
|
||||
new ShaderTagId("NBDeferredDistortPass")
|
||||
};
|
||||
|
||||
public DisturbanceMaskRenderPass(ProfilingSampler profilingSampler,Material DisturbanceMaskMat, Downsampling downSampling)
|
||||
{
|
||||
_profilingSampler = profilingSampler;
|
||||
_renderMaskMat = DisturbanceMaskMat;
|
||||
_downSampling = downSampling;
|
||||
}
|
||||
|
||||
#if UNIVERSAL_RP_17_0_OR_NEWER
|
||||
private class RenderGraphMaskPassData
|
||||
{
|
||||
public RendererListHandle rendererListHandle;
|
||||
}
|
||||
|
||||
private class GlobalTexturePassData
|
||||
{
|
||||
public TextureHandle texture;
|
||||
public int nameID;
|
||||
}
|
||||
|
||||
private static bool IsSupportedCamera(CameraType cameraType)
|
||||
{
|
||||
return cameraType == CameraType.Game || cameraType == CameraType.SceneView;
|
||||
}
|
||||
|
||||
private static void SetGlobalTextureAfterPass(RenderGraph renderGraph, TextureHandle texture, int nameID, string passName)
|
||||
{
|
||||
using (var builder = renderGraph.AddRasterRenderPass<GlobalTexturePassData>(passName, out var passData))
|
||||
{
|
||||
passData.texture = texture;
|
||||
passData.nameID = nameID;
|
||||
builder.UseTexture(texture, AccessFlags.Read);
|
||||
builder.AllowPassCulling(false);
|
||||
builder.AllowGlobalStateModification(true);
|
||||
builder.SetGlobalTextureAfterPass(texture, nameID);
|
||||
builder.SetRenderFunc(static (GlobalTexturePassData data, RasterGraphContext context) =>
|
||||
{
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void ApplyDownsampling(ref TextureDesc descriptor)
|
||||
{
|
||||
switch (_downSampling)
|
||||
{
|
||||
case Downsampling._2xBilinear:
|
||||
descriptor.width = Mathf.Max(1, descriptor.width / 2);
|
||||
descriptor.height = Mathf.Max(1, descriptor.height / 2);
|
||||
break;
|
||||
case Downsampling._4xBilinear:
|
||||
case Downsampling._4xBox:
|
||||
descriptor.width = Mathf.Max(1, descriptor.width / 4);
|
||||
descriptor.height = Mathf.Max(1, descriptor.height / 4);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private int GetDownsamplePassIndex()
|
||||
{
|
||||
return _downSampling == Downsampling._4xBox ? 1 : 0;
|
||||
}
|
||||
|
||||
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
|
||||
{
|
||||
UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
|
||||
if (!IsSupportedCamera(cameraData.cameraType) || _renderMaskMat == null)
|
||||
return;
|
||||
|
||||
UniversalResourceData resourceData = frameData.Get<UniversalResourceData>();
|
||||
if (!resourceData.activeColorTexture.IsValid())
|
||||
return;
|
||||
|
||||
UniversalRenderingData universalRenderingData = frameData.Get<UniversalRenderingData>();
|
||||
UniversalLightData lightData = frameData.Get<UniversalLightData>();
|
||||
|
||||
TextureDesc maskDescriptor = renderGraph.GetTextureDesc(resourceData.activeColorTexture);
|
||||
maskDescriptor.name = "DisturbanceMaskRT";
|
||||
maskDescriptor.colorFormat = GraphicsFormat.R16G16_SFloat;
|
||||
maskDescriptor.depthBufferBits = DepthBits.None;
|
||||
maskDescriptor.clearBuffer = true;
|
||||
maskDescriptor.clearColor = _clearDisturbanceMaskColor;
|
||||
|
||||
TextureHandle maskTexture = renderGraph.CreateTexture(maskDescriptor);
|
||||
using (var builder = renderGraph.AddRasterRenderPass<RenderGraphMaskPassData>("DisturbanceRender", out var passData))
|
||||
{
|
||||
DrawingSettings drawingSettings = RenderingUtils.CreateDrawingSettings(
|
||||
_shaderTag,
|
||||
universalRenderingData,
|
||||
cameraData,
|
||||
lightData,
|
||||
cameraData.defaultOpaqueSortFlags);
|
||||
FilteringSettings filteringSettings = new FilteringSettings(RenderQueueRange.all);
|
||||
RendererListParams rendererListParameters = new RendererListParams(
|
||||
universalRenderingData.cullResults,
|
||||
drawingSettings,
|
||||
filteringSettings);
|
||||
|
||||
passData.rendererListHandle = renderGraph.CreateRendererList(rendererListParameters);
|
||||
builder.UseRendererList(passData.rendererListHandle);
|
||||
builder.SetRenderAttachment(maskTexture, 0, AccessFlags.ReadWrite);
|
||||
|
||||
if (resourceData.activeDepthTexture.IsValid())
|
||||
builder.SetRenderAttachmentDepth(resourceData.activeDepthTexture, AccessFlags.ReadWrite);
|
||||
|
||||
if (_downSampling == Downsampling.None)
|
||||
builder.SetGlobalTextureAfterPass(maskTexture, DisturbanceMaskTex);
|
||||
|
||||
builder.SetRenderFunc(static (RenderGraphMaskPassData data, RasterGraphContext context) =>
|
||||
{
|
||||
context.cmd.DrawRendererList(data.rendererListHandle);
|
||||
});
|
||||
}
|
||||
|
||||
if (_downSampling == Downsampling.None)
|
||||
return;
|
||||
|
||||
TextureDesc downsampleDescriptor = maskDescriptor;
|
||||
downsampleDescriptor.name = "MaskDownCopyRT";
|
||||
downsampleDescriptor.clearBuffer = false;
|
||||
ApplyDownsampling(ref downsampleDescriptor);
|
||||
|
||||
TextureHandle downsampleTexture = renderGraph.CreateTexture(downsampleDescriptor);
|
||||
|
||||
if (_downSampling == Downsampling._4xBox)
|
||||
_renderMaskMat.SetFloat(SampleOffset, 2);
|
||||
|
||||
RenderGraphUtils.BlitMaterialParameters blitParameters =
|
||||
new RenderGraphUtils.BlitMaterialParameters(maskTexture, downsampleTexture, _renderMaskMat, GetDownsamplePassIndex());
|
||||
blitParameters.sourceTexturePropertyID = CameraTexture;
|
||||
|
||||
renderGraph.AddBlitPass(blitParameters, "DisturbanceMaskDownsample");
|
||||
SetGlobalTextureAfterPass(renderGraph, downsampleTexture, DisturbanceMaskTex, "Set Disturbance Mask");
|
||||
}
|
||||
#endif
|
||||
|
||||
#if UNIVERSAL_RP_13_1_2_OR_NEWER
|
||||
|
||||
public void SetUp ( RTHandle cameraRTHandle )
|
||||
{
|
||||
#if !UNITY_6000_3_OR_NEWER || (URP_COMPATIBILITY_MODE && !UNITY_6000_4_OR_NEWER)
|
||||
#pragma warning disable CS0618
|
||||
|
||||
RenderTextureDescriptor descrip = cameraRTHandle.rt.descriptor;
|
||||
|
||||
descrip.colorFormat = RenderTextureFormat.RGHalf;
|
||||
descrip.depthBufferBits = 0;
|
||||
RenderingUtils.ReAllocateIfNeeded(ref _DisturbanceMaskRTHandle, descrip, name: "DisturbanceMaskRT");
|
||||
|
||||
|
||||
switch (_downSampling)
|
||||
{
|
||||
case Downsampling._2xBilinear:
|
||||
descrip.width /= 2;
|
||||
descrip.height /= 2;
|
||||
break;
|
||||
case Downsampling._4xBilinear:
|
||||
descrip.width /= 4;
|
||||
descrip.height /= 4;
|
||||
break;
|
||||
case Downsampling._4xBox:
|
||||
descrip.width /= 4;
|
||||
descrip.height /= 4;
|
||||
break;
|
||||
}
|
||||
if (_downSampling != Downsampling.None)
|
||||
RenderingUtils.ReAllocateIfNeeded(ref _DownRT, descrip, name:"MaskDownCopyRT");
|
||||
#pragma warning restore CS0618
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
#if !UNITY_6000_3_OR_NEWER || (URP_COMPATIBILITY_MODE && !UNITY_6000_4_OR_NEWER)
|
||||
//在AddPass之前触发
|
||||
|
||||
public void SetUpDisturbanceMask(RenderTextureDescriptor descrip ,CommandBuffer cmd)
|
||||
{
|
||||
|
||||
descrip.colorFormat = RenderTextureFormat.RGHalf;
|
||||
descrip.depthBufferBits = 0;
|
||||
cmd.GetTemporaryRT(_DisturbanceMaskRTID, descrip,FilterMode.Bilinear);
|
||||
|
||||
switch (_downSampling)
|
||||
{
|
||||
case Downsampling._2xBilinear:
|
||||
descrip.width /= 2;
|
||||
descrip.height /= 2;
|
||||
break;
|
||||
case Downsampling._4xBilinear:
|
||||
descrip.width /= 4;
|
||||
descrip.height /= 4;
|
||||
break;
|
||||
case Downsampling._4xBox:
|
||||
descrip.width /= 4;
|
||||
descrip.height /= 4;
|
||||
break;
|
||||
}
|
||||
if (_downSampling != Downsampling.None)
|
||||
cmd.GetTemporaryRT(_DownRTID, descrip,FilterMode.Bilinear);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !UNITY_6000_3_OR_NEWER || (URP_COMPATIBILITY_MODE && !UNITY_6000_4_OR_NEWER)
|
||||
#pragma warning disable CS0618, CS0672
|
||||
public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
|
||||
{
|
||||
_Filtering = new FilteringSettings(RenderQueueRange.all);
|
||||
#if UNIVERSAL_RP_13_1_2_OR_NEWER
|
||||
_cameraDepthRTHandle = renderingData.cameraData.renderer.cameraDepthTargetHandle;
|
||||
#else
|
||||
_cameraDepthRTHandle = renderingData.cameraData.renderer.cameraDepthTarget;
|
||||
SetUpDisturbanceMask(renderingData.cameraData.cameraTargetDescriptor,cmd);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
|
||||
{
|
||||
#if UNIVERSAL_RP_13_1_2_OR_NEWER
|
||||
ConfigureTarget(_DisturbanceMaskRTHandle, _cameraDepthRTHandle);
|
||||
#else
|
||||
ConfigureTarget(_DisturbanceMaskRTID, _cameraDepthRTHandle);
|
||||
|
||||
#endif
|
||||
//将RT清空
|
||||
ConfigureClear(ClearFlag.Color, _clearDisturbanceMaskColor);
|
||||
}
|
||||
|
||||
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
|
||||
{
|
||||
|
||||
if (!(renderingData.cameraData.cameraType == CameraType.Game || renderingData.cameraData.cameraType == CameraType.SceneView))
|
||||
return;
|
||||
|
||||
if (!_renderMaskMat)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var DisturbanceDraw = CreateDrawingSettings(_shaderTag, ref renderingData, renderingData.cameraData.defaultOpaqueSortFlags);
|
||||
|
||||
CommandBuffer cmd = CommandBufferPool.Get();
|
||||
using (new ProfilingScope(cmd, _profilingSampler))
|
||||
{
|
||||
context.DrawRenderers(renderingData.cullResults, ref DisturbanceDraw, ref _Filtering);
|
||||
|
||||
#if UNIVERSAL_RP_13_1_2_OR_NEWER
|
||||
if (_downSampling == Downsampling.None)
|
||||
{
|
||||
cmd.SetGlobalTexture(DisturbanceMaskTex, _DisturbanceMaskRTHandle);
|
||||
}
|
||||
else
|
||||
{
|
||||
_renderMaskMat.SetTexture(CameraTexture, _DisturbanceMaskRTHandle);
|
||||
cmd.SetRenderTarget((RenderTargetIdentifier)_DownRT);
|
||||
|
||||
switch (_downSampling)
|
||||
{
|
||||
case Downsampling._2xBilinear:
|
||||
Blitter.BlitTexture(cmd, _DisturbanceMaskRTHandle, Vector2.one, _renderMaskMat, 0);
|
||||
break;
|
||||
case Downsampling._4xBilinear:
|
||||
Blitter.BlitTexture(cmd, _DisturbanceMaskRTHandle, Vector2.one, _renderMaskMat, 0);
|
||||
break;
|
||||
case Downsampling._4xBox:
|
||||
_renderMaskMat.SetFloat(SampleOffset, 2);
|
||||
Blitter.BlitTexture(cmd, _DisturbanceMaskRTHandle, Vector2.one, _renderMaskMat, 1);
|
||||
break;
|
||||
}
|
||||
|
||||
cmd.SetGlobalTexture(DisturbanceMaskTex, _DownRT);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
if (_downSampling == Downsampling.None)
|
||||
{
|
||||
cmd.SetGlobalTexture(DisturbanceMaskTex, _DisturbanceMaskRTHandle);
|
||||
}
|
||||
else
|
||||
{
|
||||
// cmd.SetGlobalTexture(_DisturbanceMaskRTID, _DisturbanceMaskRTHandle);
|
||||
//Bug:在非播放状态时,_DisturbanceMaskRTID在这里会经常丢失。造成画面闪烁。但是,只要有一个DistortObject在Scene中,并LockInspector,就不会闪烁,非常奇怪。
|
||||
cmd.SetGlobalTexture(CameraTexture, _DisturbanceMaskRTHandle);
|
||||
// _renderMaskMat.SetTexture(CameraTexture, Shader.GetGlobalTexture(_DisturbanceMaskRTID));
|
||||
cmd.SetRenderTarget(_DownRT);
|
||||
switch (_downSampling)
|
||||
{
|
||||
case Downsampling._2xBilinear:
|
||||
// Blitter.BlitTexture(cmd, _DisturbanceMaskRTHandle, _DownRT, _renderMaskMat, 0);
|
||||
// cmd.Blit(_DisturbanceMaskRTHandle, _DownRT, _renderMaskMat, 0);
|
||||
// cmd.DrawMesh(RenderingUtils.fullscreenMesh, Matrix4x4.identity, _renderMaskMat, 0, 2);
|
||||
Blit(cmd, _DisturbanceMaskRTHandle,_DownRT,_renderMaskMat,0);
|
||||
break;
|
||||
case Downsampling._4xBilinear:
|
||||
// Blitter.BlitTexture(cmd, _DisturbanceMaskRTHandle, _DownRT, _renderMaskMat, 0);
|
||||
// cmd.Blit(_DisturbanceMaskRTHandle, _DownRT, _renderMaskMat, 0);
|
||||
// cmd.DrawMesh(RenderingUtils.fullscreenMesh, Matrix4x4.identity, _renderMaskMat, 0, 2);
|
||||
Blit(cmd, _DisturbanceMaskRTHandle,_DownRT,_renderMaskMat,0);
|
||||
break;
|
||||
case Downsampling._4xBox:
|
||||
_renderMaskMat.SetFloat(SampleOffset, 2);
|
||||
// Blitter.BlitTexture(cmd, _DisturbanceMaskRTHandle, _DownRT, _renderMaskMat, 1);
|
||||
// cmd.Blit(_DisturbanceMaskRTHandle, _DownRT, _renderMaskMat, 1);
|
||||
// cmd.DrawMesh(RenderingUtils.fullscreenMesh, Matrix4x4.identity, _renderMaskMat, 0, 3);
|
||||
Blit(cmd, _DisturbanceMaskRTHandle,_DownRT,_renderMaskMat,1);
|
||||
break;
|
||||
}
|
||||
|
||||
cmd.SetGlobalTexture(DisturbanceMaskTex, _DownRT);
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
context.ExecuteCommandBuffer(cmd);
|
||||
CommandBufferPool.Release(cmd);
|
||||
}
|
||||
#pragma warning restore CS0618, CS0672
|
||||
#endif
|
||||
|
||||
#if !UNIVERSAL_RP_13_1_2_OR_NEWER && (!UNITY_6000_3_OR_NEWER || (URP_COMPATIBILITY_MODE && !UNITY_6000_4_OR_NEWER))
|
||||
// Cleanup any allocated resources that were created during the execution of this render pass.
|
||||
public override void OnCameraCleanup(CommandBuffer cmd)
|
||||
{
|
||||
cmd.ReleaseTemporaryRT(_DisturbanceMaskRTID);
|
||||
if (_downSampling != Downsampling.None)
|
||||
cmd.ReleaseTemporaryRT(_DownRTID);
|
||||
}
|
||||
|
||||
//JustForSimple
|
||||
public void Dispose()
|
||||
{
|
||||
}
|
||||
#else
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_DisturbanceMaskRTHandle?.Release();
|
||||
_DownRT?.Release();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1e411db03f9f4d85aa8a5e485158c961
|
||||
timeCreated: 1757141532
|
||||
185
Packages/NB_FX/NBPostProcessing/Runtime/NBPostProcess.cs
Normal file
185
Packages/NB_FX/NBPostProcessing/Runtime/NBPostProcess.cs
Normal file
@@ -0,0 +1,185 @@
|
||||
#if !UNITY_6000_3_OR_NEWER || (URP_COMPATIBILITY_MODE && !UNITY_6000_4_OR_NEWER)
|
||||
#define NB_URP_COMPATIBILITY_PATH
|
||||
#endif
|
||||
|
||||
// using ConfigSystem.MConfig;
|
||||
// using Sirenix.OdinInspector;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering;
|
||||
using UnityEngine.Rendering.Universal;
|
||||
|
||||
namespace NBShader
|
||||
{
|
||||
public class NBPostProcess : ScriptableRendererFeature
|
||||
{
|
||||
private NBPostProcessRenderPass _renderPass;
|
||||
private DisturbanceMaskRenderPass _disturbanceMaskRenderPass;
|
||||
private ScreenColorRenderPass _screenColorRenderPass;
|
||||
private RenderCameraOpaqueDistortObjectPass _renderCameraOpaqueDistortObjectPass;
|
||||
|
||||
|
||||
public static Material NBPostProcessMaterial;
|
||||
|
||||
//public MaskFormat maskFormat = MaskFormat.RG32;
|
||||
public Downsampling downSampling = Downsampling.None;
|
||||
|
||||
private Material _disturbanceDownSampleMat;
|
||||
private Material _screenColorDownSampleMat;
|
||||
private float _screenHeight;
|
||||
private ProfilingSampler _profilingSampler;
|
||||
|
||||
// private PostProcessingManager manager;-+
|
||||
static Mesh s_FullscreenTriangle;
|
||||
/// <summary>
|
||||
/// A fullscreen triangle mesh.抄自Unity的后处理包,拿到一个全屏的Triangle。
|
||||
/// </summary>
|
||||
static Mesh fullscreenTriangle;
|
||||
|
||||
|
||||
private bool canFind = false;
|
||||
|
||||
#if UNIVERSAL_RP_17_0_OR_NEWER
|
||||
private static bool IsCompatibilityModeEnabled()
|
||||
{
|
||||
return GraphicsSettings.GetRenderPipelineSettings<RenderGraphSettings>().enableRenderCompatibilityMode;
|
||||
}
|
||||
#endif
|
||||
|
||||
public override void Create()
|
||||
{
|
||||
|
||||
if (Shader.Find("XuanXuan/ColorBlit") == null ||
|
||||
Shader.Find("XuanXuan/Postprocess/NBPostProcessUber") == null)
|
||||
{
|
||||
canFind = false;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
canFind = true;
|
||||
}
|
||||
|
||||
#if UNIVERSAL_RP_13_1_2_OR_NEWER
|
||||
_screenColorDownSampleMat = CoreUtils.CreateEngineMaterial(Shader.Find("XuanXuan/ColorBlit"));
|
||||
#else
|
||||
_screenColorDownSampleMat = CoreUtils.CreateEngineMaterial(Shader.Find("XuanXuan/ColorBufferBlit"));
|
||||
#endif
|
||||
_screenColorRenderPass = new ScreenColorRenderPass(_screenColorDownSampleMat, downSampling);
|
||||
_screenColorRenderPass.renderPassEvent = RenderPassEvent.AfterRenderingTransparents;
|
||||
|
||||
|
||||
_profilingSampler = new ProfilingSampler("DisturbanceRender");
|
||||
_disturbanceDownSampleMat = CoreUtils.CreateEngineMaterial(Shader.Find("XuanXuan/ColorBlit"));
|
||||
_disturbanceMaskRenderPass = new DisturbanceMaskRenderPass(_profilingSampler,_disturbanceDownSampleMat,downSampling);
|
||||
_disturbanceMaskRenderPass.renderPassEvent = RenderPassEvent.AfterRenderingTransparents;
|
||||
|
||||
_renderCameraOpaqueDistortObjectPass = new RenderCameraOpaqueDistortObjectPass();
|
||||
_renderCameraOpaqueDistortObjectPass.renderPassEvent = RenderPassEvent.BeforeRenderingTransparents;
|
||||
|
||||
#if !UNIVERSAL_RP_13_1_2_OR_NEWER
|
||||
_profilingSampler = new ProfilingSampler("DisturbanceDownRTBlit");
|
||||
#endif
|
||||
|
||||
if (fullscreenTriangle == null)
|
||||
{
|
||||
/*UNITY_NEAR_CLIP_VALUE*/
|
||||
float nearClipZ = -1;
|
||||
if (SystemInfo.usesReversedZBuffer)
|
||||
nearClipZ = 1;
|
||||
|
||||
fullscreenTriangle = new Mesh();
|
||||
fullscreenTriangle.vertices = GetFullScreenTriangleVertexPosition(nearClipZ);
|
||||
fullscreenTriangle.uv = GetFullScreenTriangleTexCoord();
|
||||
fullscreenTriangle.triangles = new int[3] { 0, 1, 2 };
|
||||
}
|
||||
|
||||
// Shader shader = Shader.Find("XuanXuan/Postprocess/NBPostProcessUber");
|
||||
NBPostProcessMaterial = CoreUtils.CreateEngineMaterial(Shader.Find("XuanXuan/Postprocess/NBPostProcessUber"));
|
||||
|
||||
PostProcessingManager.InitMat();
|
||||
|
||||
|
||||
_renderPass = new NBPostProcessRenderPass(NBPostProcessMaterial,fullscreenTriangle);
|
||||
_renderPass.renderPassEvent = RenderPassEvent.AfterRenderingTransparents;
|
||||
|
||||
}
|
||||
|
||||
#if UNIVERSAL_RP_13_1_2_OR_NEWER && NB_URP_COMPATIBILITY_PATH
|
||||
#pragma warning disable CS0618, CS0672
|
||||
public override void SetupRenderPasses(ScriptableRenderer renderer, in RenderingData renderingData)
|
||||
{
|
||||
#if UNIVERSAL_RP_17_0_OR_NEWER
|
||||
if (!IsCompatibilityModeEnabled())
|
||||
return;
|
||||
#endif
|
||||
|
||||
if ((renderingData.cameraData.cameraType == CameraType.Game ||
|
||||
renderingData.cameraData.cameraType == CameraType.SceneView) && canFind)
|
||||
{
|
||||
|
||||
_disturbanceMaskRenderPass.ConfigureInput(ScriptableRenderPassInput.Color);
|
||||
_disturbanceMaskRenderPass.SetUp(renderer.cameraColorTargetHandle);
|
||||
|
||||
_screenColorRenderPass.ConfigureInput(ScriptableRenderPassInput.Color);
|
||||
_screenColorRenderPass.SetUp(renderer.cameraColorTargetHandle);
|
||||
}
|
||||
}
|
||||
#pragma warning restore CS0618, CS0672
|
||||
|
||||
#endif
|
||||
|
||||
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
|
||||
{
|
||||
if ((renderingData.cameraData.cameraType == CameraType.Game ||
|
||||
renderingData.cameraData.cameraType == CameraType.SceneView) && canFind)
|
||||
{
|
||||
|
||||
#if !UNIVERSAL_RP_13_1_2_OR_NEWER
|
||||
_screenColorRenderPass.ConfigureInput(ScriptableRenderPassInput.Color);
|
||||
_screenColorRenderPass.SetUp(renderer);
|
||||
#endif
|
||||
renderer.EnqueuePass(_renderCameraOpaqueDistortObjectPass);
|
||||
renderer.EnqueuePass(_screenColorRenderPass);
|
||||
renderer.EnqueuePass(_disturbanceMaskRenderPass);
|
||||
renderer.EnqueuePass(_renderPass);
|
||||
}
|
||||
}
|
||||
|
||||
// Should match Common.hlsl
|
||||
static Vector3[] GetFullScreenTriangleVertexPosition(float z /*= UNITY_NEAR_CLIP_VALUE*/)
|
||||
{
|
||||
var r = new Vector3[3];
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
Vector2 uv = new Vector2((i << 1) & 2, i & 2);
|
||||
r[i] = new Vector3(uv.x * 2.0f - 1.0f, uv.y * 2.0f - 1.0f, z);
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
// Should match Common.hlsl
|
||||
static Vector2[] GetFullScreenTriangleTexCoord()
|
||||
{
|
||||
var r = new Vector2[3];
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
if (SystemInfo.graphicsUVStartsAtTop)
|
||||
r[i] = new Vector2((i << 1) & 2, 1.0f - (i & 2));
|
||||
else
|
||||
r[i] = new Vector2((i << 1) & 2, i & 2);
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
CoreUtils.Destroy(_disturbanceDownSampleMat);
|
||||
//CoreUtils.Destroy(NBPostProcessMaterial);
|
||||
_disturbanceMaskRenderPass?.Dispose();
|
||||
CoreUtils.Destroy(_screenColorDownSampleMat);
|
||||
_screenColorRenderPass?.Dispose();
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d5a1f9350d8fc2c46a372955ef0e73b5
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,100 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering;
|
||||
using UnityEngine.Rendering.Universal;
|
||||
#if UNIVERSAL_RP_17_0_OR_NEWER
|
||||
using UnityEngine.Rendering.RenderGraphModule;
|
||||
#endif
|
||||
namespace NBShader
|
||||
{
|
||||
public class NBPostProcessRenderPass : ScriptableRenderPass
|
||||
{
|
||||
private ProfilingSampler _profilingSampler;
|
||||
public static Material _material;
|
||||
public Mesh _fullScreenMesh;
|
||||
private static readonly int ScreenColorCopy = Shader.PropertyToID("_ScreenColorCopy1");
|
||||
private static readonly int DisturbanceMaskTex = Shader.PropertyToID("_DisturbanceMaskTex");
|
||||
|
||||
public NBPostProcessFlags _shaderFlag => PostProcessingManager.flags;
|
||||
|
||||
private Vector4 _lastOutlineProps;
|
||||
public Vector4 outLinePorps = Vector4.one;
|
||||
|
||||
#if UNIVERSAL_RP_17_0_OR_NEWER
|
||||
private class RenderGraphPassData
|
||||
{
|
||||
public TextureHandle activeColorTexture;
|
||||
public Material material;
|
||||
public Mesh fullscreenMesh;
|
||||
}
|
||||
|
||||
private static bool IsSupportedCamera(CameraType cameraType)
|
||||
{
|
||||
return cameraType == CameraType.Game || cameraType == CameraType.SceneView;
|
||||
}
|
||||
|
||||
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
|
||||
{
|
||||
UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
|
||||
if (!IsSupportedCamera(cameraData.cameraType) || _material == null || _fullScreenMesh == null)
|
||||
return;
|
||||
|
||||
UniversalResourceData resourceData = frameData.Get<UniversalResourceData>();
|
||||
if (!resourceData.activeColorTexture.IsValid())
|
||||
return;
|
||||
|
||||
using (var builder = renderGraph.AddRasterRenderPass<RenderGraphPassData>("NBPostProcess", out var passData))
|
||||
{
|
||||
passData.activeColorTexture = resourceData.activeColorTexture;
|
||||
passData.material = _material;
|
||||
passData.fullscreenMesh = _fullScreenMesh;
|
||||
|
||||
builder.SetRenderAttachment(passData.activeColorTexture, 0, AccessFlags.ReadWrite);
|
||||
builder.UseGlobalTexture(ScreenColorCopy, AccessFlags.Read);
|
||||
builder.UseGlobalTexture(DisturbanceMaskTex, AccessFlags.Read);
|
||||
builder.SetRenderFunc(static (RenderGraphPassData data, RasterGraphContext context) =>
|
||||
{
|
||||
context.cmd.DrawMesh(data.fullscreenMesh, Matrix4x4.identity, data.material, 0, 0);
|
||||
});
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !UNITY_6000_3_OR_NEWER || (URP_COMPATIBILITY_MODE && !UNITY_6000_4_OR_NEWER)
|
||||
#pragma warning disable CS0618, CS0672
|
||||
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
|
||||
{
|
||||
if (!(renderingData.cameraData.cameraType == CameraType.Game || renderingData.cameraData.cameraType == CameraType.SceneView))
|
||||
return;
|
||||
if(_material == null) return;
|
||||
if(_fullScreenMesh == null) return;
|
||||
|
||||
// if(!_shaderFlag.CheckFlagBits(NBPostProcessFlags.FLAG_BIT_NB_POSTPROCESS_ON))return;//Disturbance需要执行
|
||||
|
||||
//ConfigureTarget()
|
||||
CommandBuffer cmdBuffer = CommandBufferPool.Get();
|
||||
cmdBuffer.Clear();
|
||||
// cmdBuffer.name = "NBPostProcess";
|
||||
|
||||
using (new ProfilingScope(cmdBuffer,_profilingSampler))
|
||||
{
|
||||
cmdBuffer.DrawMesh(_fullScreenMesh, Matrix4x4.identity, _material, 0, 0);
|
||||
}
|
||||
|
||||
context.ExecuteCommandBuffer(cmdBuffer);
|
||||
CommandBufferPool.Release(cmdBuffer);
|
||||
}
|
||||
#pragma warning restore CS0618, CS0672
|
||||
#endif
|
||||
|
||||
public NBPostProcessRenderPass(Material mat,Mesh mesh)
|
||||
{
|
||||
_material = mat;
|
||||
_fullScreenMesh = mesh;
|
||||
_profilingSampler ??= new ProfilingSampler("NBPostProcess");
|
||||
#if UNIVERSAL_RP_17_0_OR_NEWER
|
||||
requiresIntermediateTexture = true;
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2a20551d205e487f89b91897e9cb7a43
|
||||
timeCreated: 1757141611
|
||||
@@ -0,0 +1,40 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace NBShader
|
||||
{
|
||||
public class NBPostProcessFlags : ShaderFlagsBase
|
||||
{
|
||||
public const string FlagsName = "_NBPostProcessFlags";
|
||||
public static int FlagsId = Shader.PropertyToID(FlagsName);
|
||||
|
||||
public override int GetShaderFlagsId(int index = 0)
|
||||
{
|
||||
return FlagsId;
|
||||
}
|
||||
|
||||
protected override string GetShaderFlagsName(int index = 0)
|
||||
{
|
||||
return FlagsName;
|
||||
}
|
||||
|
||||
public NBPostProcessFlags(Material material = null) : base(material)
|
||||
{
|
||||
}
|
||||
|
||||
public const int FLAG_BIT_NB_POSTPROCESS_ON = 1 << 0;
|
||||
public const int FLAG_BIT_DISTORT_SPEED = 1 << 1;
|
||||
public const int FLAG_BIT_OVERLAYTEXTURE = 1 << 2;
|
||||
public const int FLAG_BIT_FLASH = 1 << 3;
|
||||
public const int FLAG_BIT_CHORATICABERRAT = 1 << 4;
|
||||
public const int FLAG_BIT_RADIALBLUR = 1 << 5;
|
||||
public const int FLAG_BIT_VIGNETTE = 1 << 6;
|
||||
public const int FLAG_BIT_OVERLAYTEXTURE_POLLARCOORD = 1 << 7;
|
||||
public const int FLAG_BIT_OVERLAYTEXTURE_MASKMAP = 1 << 8;
|
||||
public const int FLAG_BIT_POST_DISTORT_SCREEN_UV = 1 << 9; //默认来自于PolarUV
|
||||
public const int FLAG_BIT_RADIALBLUR_BY_DISTORT = 1 << 10; //默认来自于PolarUV
|
||||
public const int FLAG_BIT_CHORATICABERRAT_BY_DISTORT = 1 << 11; //默认来自于PolarUV
|
||||
public const int FLAG_BIT_FLASHTEXTURE_POLLARCOORD = 1 << 12;
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: be6a95b97f4bc3846bdada66138f6da1
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,518 @@
|
||||
using UnityEngine;
|
||||
#if CINIMACHINE_3_0
|
||||
using Unity.Cinemachine;
|
||||
#endif
|
||||
#if UNITY_EDITOR
|
||||
using UnityEditor.AnimatedValues;
|
||||
using UnityEditor;
|
||||
#endif
|
||||
|
||||
namespace NBShader
|
||||
{
|
||||
[ExecuteInEditMode]
|
||||
public class PostProcessingController : MonoBehaviour
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
public AnimBool[] AnimBools = new AnimBool[10];
|
||||
#endif
|
||||
[SerializeField]
|
||||
private PostProcessingManager _manager;
|
||||
|
||||
public int index
|
||||
{
|
||||
get
|
||||
{
|
||||
return _index;
|
||||
}
|
||||
}
|
||||
private int _index;
|
||||
public void SetIndex(int controllerIndex)
|
||||
{
|
||||
_index = controllerIndex;
|
||||
}
|
||||
|
||||
public Vector2 customScreenCenterPos = new Vector2(0.5f, 0.5f);
|
||||
private Vector2 _lastCustomScreenCenterPos = new Vector2(0.5f, 0.5f);
|
||||
public bool chromaticAberrationToggle = false;
|
||||
public bool caFromDistort = false;
|
||||
public float chromaticAberrationIntensity = 0.2f;
|
||||
public float chromaticAberrationPos = 0.5f;
|
||||
public float chromaticAberrationRange = 0.5f;
|
||||
public bool distortSpeedToggle = false;
|
||||
public bool distortScreenUVMode = false;
|
||||
public Texture2D distortSpeedTexture;
|
||||
public float distortTextureMidValue = 1;
|
||||
public Vector4 distortSpeedTexSt = new Vector4(30,1,0,0);
|
||||
public float distortSpeedIntensity = 1f;
|
||||
public float distortSpeedPosition = 0.5f;
|
||||
public float distortSpeedRange = 1f;
|
||||
public float distortSpeedMoveSpeedX = 0.1f;
|
||||
public float distortSpeedMoveSpeed = -0.5f;//因为老的做法是没有X偏移的,只有Y的偏移,不改变量兼容老做法。
|
||||
private readonly int _distortSpeedTextureID = Shader.PropertyToID("_SpeedDistortMap");
|
||||
private readonly int _distortSpeedTextureStID = Shader.PropertyToID("_SpeedDistortMap_ST");
|
||||
public bool radialBlurToggle = false;
|
||||
public bool radialBlurFromDistort = false;
|
||||
[Range(1,12)]
|
||||
public int radialBlurSampleCount = 4;
|
||||
public float radialBlurIntensity = 1;
|
||||
public float radialBlurPos = 0.5f;
|
||||
public float radialBlurRange = 0.5f;
|
||||
#if CINIMACHINE_3_0
|
||||
public bool cameraShakeToggle = false;
|
||||
public CinemachineCamera cinemachineCamera;
|
||||
public float cameraShakeIntensity;
|
||||
#endif
|
||||
|
||||
public bool overlayTextureToggle = false;
|
||||
public bool overlayTexturePolarCoordMode = false;
|
||||
public Texture2D overlayTexture;
|
||||
private readonly int _overlayTextureID = Shader.PropertyToID("_TextureOverlay");
|
||||
private readonly int _overlayTextureStID = Shader.PropertyToID("_TextureOverlay_ST");
|
||||
private readonly int _textureOverlayAnimProperty = Shader.PropertyToID("_TextureOverlayAnim");
|
||||
private readonly int _textureOverlayMaskProperty = Shader.PropertyToID("_TextureOverlayMask");
|
||||
private readonly int _textureOverlayMaskStProperty = Shader.PropertyToID("_TextureOverlayMask_ST");
|
||||
public Vector4 overlayTextureSt = new Vector4(1, 1, 0, 0);
|
||||
public Vector2 overlayTextureAnim = new Vector2(0, 0);
|
||||
public float overlayTextureIntensity = 1f;
|
||||
public Texture2D overlayMaskTexture;
|
||||
public Vector4 overlayMaskTextureSt;
|
||||
|
||||
public bool flashToggle = false;
|
||||
[Range(0,1)]
|
||||
public float flashIntensity = 1f;
|
||||
[Range(0,1)]
|
||||
public float flashInvertIntensity = 0f;
|
||||
public float flashDeSaturateIntensity = 1f;
|
||||
public float flashGradientRange = 0.25f;
|
||||
public float flashContrast = 0.5f;
|
||||
[ColorUsage(false, true)]
|
||||
public Color flashColor = new Color(2f,2f,2f,1f);
|
||||
[ColorUsage(false, true)]
|
||||
public Color blackFlashColor = new Color(0f,0f,0f,1f);
|
||||
private readonly int _flashTextureProperty = Shader.PropertyToID("_FlashTexture");
|
||||
public Texture2D flashTexture;
|
||||
public Vector4 flashTextureScaleOffset = new Vector4(10f,0.1f,0f,0f);
|
||||
public bool flashTexturePolarCoordMode = true;
|
||||
public Vector2 flashVec = new Vector2(0, 0.05f);
|
||||
public Vector2 flashVecZW = new Vector2(0.2f, 0.2f);//FlashTextureMask
|
||||
public float flashTextureIntensity = 0.5f;
|
||||
|
||||
public bool vignetteToggle = false;
|
||||
public Color vignetteColor = Color.black;
|
||||
private readonly int _vignetteColorID = Shader.PropertyToID("_VignetteColor");
|
||||
public float vignetteIntensity = 1;
|
||||
public float vignetteRoundness = 1;
|
||||
public float vignetteSmothness = 10;
|
||||
[Range(0,1)]
|
||||
public float vignetteFill = 0f;
|
||||
|
||||
|
||||
public void InitController()
|
||||
{
|
||||
if (this.isActiveAndEnabled == false)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_manager = PostProcessingManager.Instance;
|
||||
|
||||
_manager.InitController(this);
|
||||
InitAllSettings();
|
||||
|
||||
}
|
||||
|
||||
void InitAllSettings()
|
||||
{
|
||||
SetScreenCenterPos();
|
||||
SetToggles();
|
||||
SetUVFromDistort();
|
||||
SetTexture();
|
||||
#if CINIMACHINE_3_0
|
||||
InitCinemachineCamera();
|
||||
#endif
|
||||
}
|
||||
|
||||
void SetScreenCenterPos()
|
||||
{
|
||||
PostProcessingManager.customScreenCenterPos = customScreenCenterPos;
|
||||
_lastCustomScreenCenterPos = customScreenCenterPos;
|
||||
}
|
||||
|
||||
void SetUVFromDistort()
|
||||
{
|
||||
PostProcessingManager.isDistortScreenUVMode = distortScreenUVMode;
|
||||
PostProcessingManager.isCaByDistort = caFromDistort;
|
||||
PostProcessingManager.isRadialBlurByDistort = radialBlurFromDistort;
|
||||
}
|
||||
|
||||
private void SetTexture()
|
||||
{
|
||||
if(PostProcessingManager.material == null) return;
|
||||
if (distortSpeedToggle)
|
||||
{
|
||||
if (distortSpeedTexture != null)
|
||||
{
|
||||
PostProcessingManager.material.SetTexture(_distortSpeedTextureID, distortSpeedTexture);
|
||||
PostProcessingManager.distortTextureMidValue = distortTextureMidValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
PostProcessingManager.material.SetTexture(_distortSpeedTextureID, null);
|
||||
}
|
||||
}
|
||||
|
||||
if (flashToggle&& flashTexture)
|
||||
{
|
||||
PostProcessingManager.material.SetTexture(_flashTextureProperty, flashTexture);
|
||||
if (flashTexturePolarCoordMode)
|
||||
{
|
||||
PostProcessingManager.flags.SetFlagBits(NBPostProcessFlags.FLAG_BIT_FLASHTEXTURE_POLLARCOORD);
|
||||
}
|
||||
else
|
||||
{
|
||||
PostProcessingManager.flags.ClearFlagBits(NBPostProcessFlags.FLAG_BIT_FLASHTEXTURE_POLLARCOORD);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
PostProcessingManager.material.SetTexture(_flashTextureProperty, null);
|
||||
PostProcessingManager.flags.ClearFlagBits(NBPostProcessFlags.FLAG_BIT_FLASHTEXTURE_POLLARCOORD);
|
||||
}
|
||||
|
||||
if (overlayTextureToggle)
|
||||
{
|
||||
if (overlayTexturePolarCoordMode)
|
||||
{
|
||||
PostProcessingManager.flags.SetFlagBits(NBPostProcessFlags.FLAG_BIT_OVERLAYTEXTURE_POLLARCOORD);
|
||||
}
|
||||
else
|
||||
{
|
||||
PostProcessingManager.flags.ClearFlagBits(NBPostProcessFlags.FLAG_BIT_OVERLAYTEXTURE_POLLARCOORD);
|
||||
}
|
||||
|
||||
if (overlayTexture)
|
||||
{
|
||||
Debug.Log("SetOverlayTexture");
|
||||
PostProcessingManager.material.SetTexture(_overlayTextureID,overlayTexture);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log("ClearOverlayTexture");
|
||||
PostProcessingManager.material.SetTexture(_overlayTextureID,null);
|
||||
}
|
||||
|
||||
if (overlayMaskTexture)
|
||||
{
|
||||
Debug.Log("SetOverlayMaskTexture");
|
||||
PostProcessingManager.material.SetTexture(_textureOverlayMaskProperty,overlayMaskTexture);
|
||||
PostProcessingManager.flags.SetFlagBits(NBPostProcessFlags.FLAG_BIT_OVERLAYTEXTURE_MASKMAP);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log("ClearOverlayMaskTexture");
|
||||
PostProcessingManager.flags.ClearFlagBits(NBPostProcessFlags.FLAG_BIT_OVERLAYTEXTURE_MASKMAP);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void SetToggles()
|
||||
{
|
||||
SetBit(ref PostProcessingManager.chromaticAberrationToggles,index,chromaticAberrationToggle);
|
||||
SetBit(ref PostProcessingManager.distortSpeedToggles,index,distortSpeedToggle);
|
||||
#if CINIMACHINE_3_0
|
||||
SetBit(ref PostProcessingManager.cameraShakeToggles,index,cameraShakeToggle);
|
||||
#endif
|
||||
SetBit(ref PostProcessingManager.overlayTextureToggles,index,overlayTextureToggle);
|
||||
SetBit(ref PostProcessingManager.flashToggles,index,flashToggle);
|
||||
SetBit(ref PostProcessingManager.radialBlurToggles,index,radialBlurToggle);
|
||||
SetBit(ref PostProcessingManager.vignetteToggles,index,vignetteToggle);
|
||||
|
||||
#if UNITY_EDITOR
|
||||
SetTexture();
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
private void ClearToggles()
|
||||
{
|
||||
SetBit(ref PostProcessingManager.chromaticAberrationToggles,index,false);
|
||||
SetBit(ref PostProcessingManager.distortSpeedToggles,index,false);
|
||||
#if CINIMACHINE_3_0
|
||||
SetBit(ref PostProcessingManager.cameraShakeToggles,index,false);
|
||||
#endif
|
||||
SetBit(ref PostProcessingManager.overlayTextureToggles,index,false);
|
||||
SetBit(ref PostProcessingManager.flashToggles,index,false);
|
||||
SetBit(ref PostProcessingManager.radialBlurToggles,index,false);
|
||||
SetBit(ref PostProcessingManager.vignetteToggles,index,false);
|
||||
}
|
||||
|
||||
private bool _lastChormaticAberrationToggle = false;
|
||||
private bool _lastDistortSpeedToggle = false;
|
||||
#if CINIMACHINE_3_0
|
||||
private bool _lastCamerashakeToggle = false;
|
||||
#endif
|
||||
private bool _lastOverlayTextureToggle = false;
|
||||
private bool _lastFlashToggle= false;
|
||||
private bool _lastRadialBlurToggle= false;
|
||||
private bool _lastVignetteToggle= false;
|
||||
|
||||
bool checkIfToggleChanged(ref bool lastTogggle, bool currentToggle)
|
||||
{
|
||||
if (lastTogggle != currentToggle)
|
||||
{
|
||||
lastTogggle = currentToggle;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static void SetBit(ref int bit, int index,bool bitToggle)
|
||||
{
|
||||
if (bitToggle)
|
||||
{
|
||||
bit |= (1 << index);
|
||||
}
|
||||
else
|
||||
{
|
||||
bit &= ~(1 << index);
|
||||
}
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
void FindManager()
|
||||
{
|
||||
UnityEditor.Selection.activeObject = _manager.gameObject;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CINIMACHINE_3_0
|
||||
#if UNITY_EDITOR
|
||||
public void FindVirtualCamera()
|
||||
{
|
||||
UnityEditor.Selection.activeObject = _manager.currentVirtualCamera;
|
||||
}
|
||||
#endif
|
||||
|
||||
public void InitCinemachineCamera()
|
||||
{
|
||||
if (cinemachineCamera)
|
||||
{
|
||||
if (!cinemachineCamera.gameObject.TryGetComponent<CinemachineBasicMultiChannelPerlin>(out var _perlin))
|
||||
{
|
||||
_perlin = cinemachineCamera.gameObject.AddComponent<CinemachineBasicMultiChannelPerlin>();
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
if (_perlin)
|
||||
{
|
||||
if (_perlin.NoiseProfile == null)
|
||||
{
|
||||
_perlin.NoiseProfile =
|
||||
UnityEditor.AssetDatabase.LoadAssetAtPath<NoiseSettings>(
|
||||
"Packages/com.xuanxuan.nb.fx/NBPostProcessing/3DPostionShake.asset");
|
||||
_perlin.FrequencyGain = 5f; //做一个自定义
|
||||
}
|
||||
_perlin.AmplitudeGain = 0f; //一开始先不要震动
|
||||
}
|
||||
|
||||
if (_manager)
|
||||
{
|
||||
_manager.currentVirtualCamera = cinemachineCamera;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
// Debug.Log("InitController");
|
||||
InitController();
|
||||
#if UNITY_EDITOR
|
||||
// 注册编辑器帧更新事件
|
||||
EditorApplication.update += ControllerEditorUpdate;
|
||||
_manager.ReRegistEditorUpdate();//保证Manager的注册在最后
|
||||
#endif
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
// Debug.Log("EndController");
|
||||
EndController();
|
||||
#if UNITY_EDITOR
|
||||
// 注册编辑器帧更新事件
|
||||
EditorApplication.update -= ControllerEditorUpdate;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool isFirstUpdate = true;
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
if (isFirstUpdate)
|
||||
{
|
||||
isFirstUpdate = false;
|
||||
return;
|
||||
}
|
||||
if(!PostProcessingManager.material) return;
|
||||
//#if UNITY_EDITOR
|
||||
//Odin的ToggleGroup和OnValueChange功能冲突,导致不一定生效。不好调试。所以用手动的方式更新。
|
||||
bool isToggleChanged = false;
|
||||
isToggleChanged |= checkIfToggleChanged(ref _lastChormaticAberrationToggle, chromaticAberrationToggle);
|
||||
isToggleChanged |= checkIfToggleChanged(ref _lastDistortSpeedToggle, distortSpeedToggle);
|
||||
#if CINIMACHINE_3_0
|
||||
isToggleChanged |= checkIfToggleChanged(ref _lastCamerashakeToggle, cameraShakeToggle);
|
||||
#endif
|
||||
isToggleChanged |= checkIfToggleChanged(ref _lastOverlayTextureToggle, overlayTextureToggle);
|
||||
isToggleChanged |= checkIfToggleChanged(ref _lastFlashToggle, flashToggle);
|
||||
isToggleChanged |= checkIfToggleChanged(ref _lastRadialBlurToggle, radialBlurToggle);
|
||||
isToggleChanged |= checkIfToggleChanged(ref _lastVignetteToggle, vignetteToggle);
|
||||
if (isToggleChanged)
|
||||
{
|
||||
SetToggles();
|
||||
}
|
||||
//#endif
|
||||
|
||||
if (customScreenCenterPos != _lastCustomScreenCenterPos)
|
||||
{
|
||||
SetScreenCenterPos();
|
||||
}
|
||||
|
||||
|
||||
if (chromaticAberrationToggle)
|
||||
{
|
||||
PostProcessingManager.chromaticAberrationIntensity =
|
||||
Mathf.Max(PostProcessingManager.chromaticAberrationIntensity, chromaticAberrationIntensity);
|
||||
PostProcessingManager.chromaticAberrationPos =
|
||||
Mathf.Max(PostProcessingManager.chromaticAberrationPos, chromaticAberrationPos);
|
||||
PostProcessingManager.chromaticAberrationRange =
|
||||
Mathf.Max(PostProcessingManager.chromaticAberrationRange, chromaticAberrationRange);
|
||||
}
|
||||
|
||||
if (distortSpeedToggle)
|
||||
{
|
||||
if (index == PostProcessingManager.laseUpdateControllerIndex)
|
||||
{
|
||||
//只有这里才会更新Scale
|
||||
PostProcessingManager.material.SetVector(_distortSpeedTextureStID, distortSpeedTexSt);
|
||||
}
|
||||
|
||||
PostProcessingManager.distortSpeedIntensity =
|
||||
Mathf.Max(PostProcessingManager.distortSpeedIntensity, distortSpeedIntensity);
|
||||
PostProcessingManager.distortSpeedPosition =
|
||||
Mathf.Max(PostProcessingManager.distortSpeedPosition, distortSpeedPosition);
|
||||
PostProcessingManager.distortSpeedRange =
|
||||
Mathf.Max(PostProcessingManager.distortSpeedRange, distortSpeedRange);
|
||||
PostProcessingManager.distortSpeedMoveSpeedX =
|
||||
Mathf.Abs(PostProcessingManager.distortSpeedMoveSpeedX) > Mathf.Abs(distortSpeedMoveSpeedX)
|
||||
? PostProcessingManager.distortSpeedMoveSpeedX
|
||||
: distortSpeedMoveSpeedX;
|
||||
PostProcessingManager.distortSpeedMoveSpeedY =
|
||||
Mathf.Abs(PostProcessingManager.distortSpeedMoveSpeedY) > Mathf.Abs(distortSpeedMoveSpeed)
|
||||
? PostProcessingManager.distortSpeedMoveSpeedY
|
||||
: distortSpeedMoveSpeed;
|
||||
}
|
||||
|
||||
#if CINIMACHINE_3_0
|
||||
if (cameraShakeToggle)
|
||||
{
|
||||
PostProcessingManager.cameraShakeIntensity =
|
||||
Mathf.Max(PostProcessingManager.cameraShakeIntensity, cameraShakeIntensity);
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
if (overlayTextureToggle)
|
||||
{
|
||||
if (index == PostProcessingManager.laseUpdateControllerIndex)
|
||||
{
|
||||
PostProcessingManager.material.SetVector(_overlayTextureStID, overlayTextureSt);
|
||||
PostProcessingManager.material.SetVector(_textureOverlayMaskStProperty, overlayMaskTextureSt);
|
||||
PostProcessingManager.material.SetVector(_textureOverlayAnimProperty,overlayTextureAnim);
|
||||
}
|
||||
|
||||
PostProcessingManager.overlayTextureIntensity = Mathf.Max(PostProcessingManager.overlayTextureIntensity,
|
||||
overlayTextureIntensity);
|
||||
}
|
||||
|
||||
if (flashToggle)
|
||||
{
|
||||
PostProcessingManager.flashDesaturateIntensity =
|
||||
Mathf.Max(PostProcessingManager.flashDesaturateIntensity, flashDeSaturateIntensity);
|
||||
PostProcessingManager.flashInvertIntensity =
|
||||
Mathf.Max(PostProcessingManager.flashInvertIntensity, flashInvertIntensity);
|
||||
PostProcessingManager.flashIntensity = Mathf.Max(PostProcessingManager.flashIntensity, flashIntensity);
|
||||
PostProcessingManager.flashContrast =
|
||||
Mathf.Max(PostProcessingManager.flashContrast, flashContrast);
|
||||
PostProcessingManager.flashGradientRange = Mathf.Max(PostProcessingManager.flashGradientRange, flashGradientRange);
|
||||
PostProcessingManager.flashVec = new Vector4(flashVec.x,flashVec.y,flashVecZW.x,flashVecZW.y);
|
||||
PostProcessingManager.flashTextureIntensity = Mathf.Max(PostProcessingManager.flashTextureIntensity, flashTextureIntensity);
|
||||
PostProcessingManager.flashTextureScaleOffset = flashTextureScaleOffset;
|
||||
|
||||
PostProcessingManager.flashColor = flashColor;
|
||||
PostProcessingManager.blackFlashColor = blackFlashColor;
|
||||
}
|
||||
|
||||
if (radialBlurToggle)
|
||||
{
|
||||
PostProcessingManager.radialBlurIntensity =
|
||||
Mathf.Max(PostProcessingManager.radialBlurIntensity, radialBlurIntensity);
|
||||
PostProcessingManager.radialBlurSampleCount = Mathf.Max(PostProcessingManager.radialBlurSampleCount,
|
||||
radialBlurSampleCount);
|
||||
PostProcessingManager.radialBlurPos = Mathf.Max(PostProcessingManager.radialBlurPos, radialBlurPos);
|
||||
PostProcessingManager.radialBlurRange = Mathf.Max(PostProcessingManager.radialBlurRange, radialBlurRange);
|
||||
}
|
||||
|
||||
if (vignetteToggle)
|
||||
{
|
||||
PostProcessingManager.vignetteIntensity =
|
||||
Mathf.Max(PostProcessingManager.vignetteIntensity, vignetteIntensity);
|
||||
PostProcessingManager.vignetteRoundness = Mathf.Max(PostProcessingManager.vignetteRoundness, vignetteRoundness);
|
||||
PostProcessingManager.vignetteSmothness = Mathf.Max(PostProcessingManager.vignetteSmothness, vignetteSmothness);
|
||||
PostProcessingManager.vignetteFill = Mathf.Max(PostProcessingManager.vignetteFill, vignetteFill);
|
||||
if (index == PostProcessingManager.laseUpdateControllerIndex)
|
||||
{
|
||||
PostProcessingManager.material.SetColor(_vignetteColorID,vignetteColor);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
void EndController()
|
||||
{
|
||||
ClearToggles();
|
||||
_manager.EndController(this);
|
||||
}
|
||||
|
||||
|
||||
#if UNITY_EDITOR
|
||||
[UnityEditor.MenuItem("GameObject/创建NB后处理特效")]
|
||||
static void CreatMenu()
|
||||
{
|
||||
GameObject Effect = new GameObject();
|
||||
Effect.name = "NBPostprocessController";
|
||||
PostProcessingController controller = Effect.AddComponent<PostProcessingController>();
|
||||
|
||||
UnityEditor.Selection.activeObject = Effect;
|
||||
}
|
||||
|
||||
void ControllerEditorUpdate()
|
||||
{
|
||||
if (!Application.isPlaying)
|
||||
{
|
||||
Update();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 909ea7d136ae0c349a24f02cac1f5f71
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences:
|
||||
- manager: {instanceID: 0}
|
||||
- distortSpeedTexture: {fileID: 2800000, guid: 7f808d0c8608b954d8f20cb4132c3049, type: 3}
|
||||
- overlayTexture: {instanceID: 0}
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
727
Packages/NB_FX/NBPostProcessing/Runtime/PostProcessingManager.cs
Normal file
727
Packages/NB_FX/NBPostProcessing/Runtime/PostProcessingManager.cs
Normal file
@@ -0,0 +1,727 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
#if UNITY_EDITOR
|
||||
using UnityEditor;
|
||||
#endif
|
||||
|
||||
#if CINIMACHINE_3_0
|
||||
using Unity.Cinemachine;
|
||||
#endif
|
||||
|
||||
namespace NBShader
|
||||
{
|
||||
|
||||
|
||||
[ExecuteAlways]
|
||||
public class PostProcessingManager : MonoBehaviour
|
||||
{
|
||||
//单例实现
|
||||
private static PostProcessingManager _instance = null;
|
||||
|
||||
public static PostProcessingManager Instance
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_instance == null)
|
||||
{
|
||||
_instance = UnityObjectFindCompat.FindAny<PostProcessingManager>();
|
||||
if (_instance == null)
|
||||
{
|
||||
GameObject singletonObj = new GameObject();
|
||||
_instance = singletonObj.AddComponent<PostProcessingManager>();
|
||||
singletonObj.name = "NBPostProcessManager";
|
||||
if (Application.isPlaying)
|
||||
{
|
||||
DontDestroyOnLoad(singletonObj);
|
||||
}
|
||||
else
|
||||
{
|
||||
singletonObj.hideFlags = HideFlags.HideAndDontSave;//如果要调试可以去掉这个属性
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return _instance;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (_instance == null)
|
||||
{
|
||||
_instance = this;
|
||||
}
|
||||
else
|
||||
{
|
||||
DestroyImmediate(this);
|
||||
}
|
||||
}
|
||||
|
||||
// [ReadOnly] public Volume volume;
|
||||
// private static VolumeProfile profile;
|
||||
// [ReadOnly]
|
||||
public static Material material
|
||||
{
|
||||
get { return NBPostProcess.NBPostProcessMaterial; }
|
||||
}
|
||||
|
||||
public static NBPostProcessFlags flags = new NBPostProcessFlags();
|
||||
|
||||
// public CinemachineBrain cameraBrain;
|
||||
// public CinemachineVirtualCamera currentVirtualCamera;
|
||||
#if CINIMACHINE_3_0
|
||||
public CinemachineCamera currentVirtualCamera;
|
||||
private CinemachineBasicMultiChannelPerlin _perlin;
|
||||
#endif
|
||||
|
||||
public static void InitMat()
|
||||
{
|
||||
flags.SetMaterial(PostProcessingManager.material);
|
||||
if (_instance)
|
||||
{
|
||||
_instance.ResetEffect();
|
||||
}
|
||||
}
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
if (_controllerIndexFlags > 0)
|
||||
{
|
||||
ReRegistEditorUpdate();
|
||||
}
|
||||
else
|
||||
{
|
||||
EditorApplication.update += EditorUpdate;
|
||||
}
|
||||
// 注册编辑器帧更新事件
|
||||
#endif
|
||||
|
||||
//重置Flag
|
||||
flags = new NBPostProcessFlags(material);
|
||||
flags.SetFlagBits(0);
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
// 注册编辑器帧更新事件
|
||||
EditorApplication.update -= EditorUpdate;
|
||||
#endif
|
||||
flags.ClearFlagBits(NBPostProcessFlags.FLAG_BIT_NB_POSTPROCESS_ON);
|
||||
}
|
||||
|
||||
|
||||
// [ShowInInspector]
|
||||
// #if UNITY_EDITOR
|
||||
// [BinaryInt(8)]
|
||||
// #endif
|
||||
private int _controllerIndexFlags = 0;
|
||||
|
||||
public static int laseUpdateControllerIndex;
|
||||
|
||||
private int GetControllerIndex()
|
||||
{
|
||||
for (int i = 0; i < 31; i++)
|
||||
{
|
||||
if (((~_controllerIndexFlags) & (1 << i)) != 0)
|
||||
{
|
||||
_controllerIndexFlags |= (1 << i);
|
||||
laseUpdateControllerIndex = i;
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return 32;
|
||||
}
|
||||
|
||||
private void ReleaseControllerIndex(int index)
|
||||
{
|
||||
_controllerIndexFlags &= ~(1 << index);
|
||||
}
|
||||
|
||||
private int CountBit(int bit)
|
||||
{
|
||||
int count = 0;
|
||||
while (bit > 0)
|
||||
{
|
||||
bit = bit & (bit - 1);
|
||||
count++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
//每次Controller触发Play都会触发Init
|
||||
public void InitController(PostProcessingController controller)
|
||||
{
|
||||
#if CINIMACHINE_3_0
|
||||
if (controller.cinemachineCamera != null)
|
||||
{
|
||||
currentVirtualCamera = controller.cinemachineCamera;
|
||||
_perlin = currentVirtualCamera.gameObject.GetComponent<CinemachineBasicMultiChannelPerlin>();
|
||||
}
|
||||
#endif
|
||||
|
||||
controller.SetIndex(GetControllerIndex());
|
||||
}
|
||||
|
||||
public void EndController(PostProcessingController controller)
|
||||
{
|
||||
#if CINIMACHINE_3_0
|
||||
if (currentVirtualCamera == controller.cinemachineCamera)
|
||||
{
|
||||
currentVirtualCamera = null;
|
||||
_perlin = null;
|
||||
}
|
||||
#endif
|
||||
|
||||
ReleaseControllerIndex(controller.index);
|
||||
controller.SetIndex(32); //设置32为关闭index
|
||||
}
|
||||
|
||||
private void EffectUpdater(Action initEffect, Action updateEffect, Action endEffect, ref bool lastIsEffect,
|
||||
int effectToggles)
|
||||
{
|
||||
if (effectToggles > 0)
|
||||
{
|
||||
if (!lastIsEffect)
|
||||
{
|
||||
initEffect();
|
||||
}
|
||||
|
||||
updateEffect();
|
||||
lastIsEffect = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (lastIsEffect)
|
||||
{
|
||||
endEffect();
|
||||
lastIsEffect = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private bool isFirstUpdate = true;
|
||||
|
||||
private void ResetEffect()
|
||||
{
|
||||
if (_lastIsChromaticAberration)
|
||||
{
|
||||
EndChromaticAberration();
|
||||
_lastIsChromaticAberration = false;
|
||||
}
|
||||
|
||||
if (_lastIsRadialBlur)
|
||||
{
|
||||
EndRadialBlur();
|
||||
_lastIsRadialBlur = false;
|
||||
}
|
||||
|
||||
if (_lastIsDistortSpeed)
|
||||
{
|
||||
EndDistortSpeed();
|
||||
_lastIsDistortSpeed = false;
|
||||
}
|
||||
|
||||
#if CINIMACHINE_3_0
|
||||
if (_lastIsCameraShake)
|
||||
{
|
||||
EndCameraShake();
|
||||
_lastIsCameraShake = false;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (_lastIsOverlayTexture)
|
||||
{
|
||||
EndOverlayTexture();
|
||||
_lastIsOverlayTexture = false;
|
||||
}
|
||||
|
||||
if (_lastIsFlash)
|
||||
{
|
||||
EndFlash();
|
||||
_lastIsFlash = false;
|
||||
}
|
||||
|
||||
if (_lastIsVignette)
|
||||
{
|
||||
EndVignette();
|
||||
_lastIsVignette = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void LateUpdate() //晚于所有脚本触发。
|
||||
{
|
||||
if (isFirstUpdate)
|
||||
{
|
||||
isFirstUpdate = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!material) return;
|
||||
/*
|
||||
#if UNITY_EDITOR
|
||||
if (flags.GetMaterial() != PostProcessingManager.material)
|
||||
{
|
||||
flags.SetMaterial(PostProcessingManager.material);
|
||||
}
|
||||
#endif
|
||||
*/
|
||||
|
||||
if (_controllerIndexFlags == 0)
|
||||
{
|
||||
ResetEffect();
|
||||
flags.ClearFlagBits(NBPostProcessFlags.FLAG_BIT_NB_POSTPROCESS_ON);
|
||||
return;
|
||||
}
|
||||
|
||||
EffectUpdater(InitChromaticAberration, UpdateChromaticAberration, EndChromaticAberration,
|
||||
ref _lastIsChromaticAberration, chromaticAberrationToggles);
|
||||
EffectUpdater(InitDistortSpeed, UpdateDistortSpeed, EndDistortSpeed, ref _lastIsDistortSpeed,
|
||||
distortSpeedToggles);
|
||||
EffectUpdater(InitRadialBlur, UpdateRadialBlur, EndRadialBlur, ref _lastIsRadialBlur, radialBlurToggles);
|
||||
|
||||
bool isSetCustomScreenCenterPos =
|
||||
(chromaticAberrationToggles | distortSpeedToggles | radialBlurToggles|flashToggles) > 0;
|
||||
|
||||
if (isSetCustomScreenCenterPos)
|
||||
{
|
||||
material.SetVector(_customScreenCenterProperty,
|
||||
new Vector4(customScreenCenterPos.x, customScreenCenterPos.y, 0, 0));
|
||||
}
|
||||
|
||||
#if CINIMACHINE_3_0
|
||||
EffectUpdater(() => { }, UpdateCameraShake, EndCameraShake, ref _lastIsCameraShake, cameraShakeToggles);
|
||||
#endif
|
||||
EffectUpdater(InitOverlayTexture, UpdateOverlayTexture, EndOverlayTexture, ref _lastIsOverlayTexture,
|
||||
overlayTextureToggles);
|
||||
EffectUpdater(InitFlash, UpdateFlash, EndFlash, ref _lastIsFlash, flashToggles);
|
||||
EffectUpdater(InitVignette, UpdateVignette, EndVignette, ref _lastIsVignette, vignetteToggles);
|
||||
|
||||
bool hasEffect =
|
||||
(
|
||||
chromaticAberrationToggles |
|
||||
distortSpeedToggles |
|
||||
#if CINIMACHINE_3_0
|
||||
cameraShakeToggles |
|
||||
#endif
|
||||
radialBlurToggles |
|
||||
overlayTextureToggles |
|
||||
flashToggles |
|
||||
vignetteToggles
|
||||
) > 0;
|
||||
|
||||
if (hasEffect)
|
||||
{
|
||||
flags.SetFlagBits(NBPostProcessFlags.FLAG_BIT_NB_POSTPROCESS_ON);
|
||||
}
|
||||
else
|
||||
{
|
||||
flags.ClearFlagBits(NBPostProcessFlags.FLAG_BIT_NB_POSTPROCESS_ON);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private readonly int _customScreenCenterProperty = Shader.PropertyToID("_CustomScreenCenter");
|
||||
public static Vector2 customScreenCenterPos = new Vector2(0.5f, 0.5f);
|
||||
|
||||
|
||||
|
||||
|
||||
#region 色散
|
||||
|
||||
//色散相关
|
||||
// private ChromaticAberration chromaticAberrationComp;
|
||||
// private bool preserveChromaticAberrationActive;
|
||||
// private float preserveChromaticAberrationIntensity;
|
||||
private bool _lastIsChromaticAberration = false;
|
||||
private readonly int _chromaticAberrationVecProperty = Shader.PropertyToID("_ChromaticAberrationVec");
|
||||
|
||||
public static int chromaticAberrationToggles = 0;
|
||||
|
||||
public static bool isCaByDistort = false;
|
||||
private bool _lastIsCaByDistort = false;
|
||||
|
||||
public static float chromaticAberrationIntensity = 0;
|
||||
public static float chromaticAberrationPos = 0;
|
||||
public static float chromaticAberrationRange = 0;
|
||||
|
||||
private void InitChromaticAberration()
|
||||
{
|
||||
// Debug.Log("InitCA");
|
||||
flags.SetFlagBits(NBPostProcessFlags.FLAG_BIT_CHORATICABERRAT);
|
||||
}
|
||||
|
||||
private void UpdateChromaticAberration()
|
||||
{
|
||||
if (_lastIsCaByDistort != isCaByDistort)
|
||||
{
|
||||
if (isCaByDistort)
|
||||
{
|
||||
flags.SetFlagBits(NBPostProcessFlags.FLAG_BIT_CHORATICABERRAT_BY_DISTORT);
|
||||
}
|
||||
else
|
||||
{
|
||||
flags.ClearFlagBits(NBPostProcessFlags.FLAG_BIT_CHORATICABERRAT_BY_DISTORT);
|
||||
}
|
||||
|
||||
_lastIsCaByDistort = isCaByDistort;
|
||||
}
|
||||
|
||||
material.SetVector(_chromaticAberrationVecProperty,
|
||||
new Vector4(chromaticAberrationIntensity, chromaticAberrationPos, chromaticAberrationRange));
|
||||
chromaticAberrationIntensity = 0; //等待下一次update
|
||||
chromaticAberrationPos = 0; //等待下一次update
|
||||
chromaticAberrationRange = 0; //等待下一次update
|
||||
}
|
||||
|
||||
private void EndChromaticAberration()
|
||||
{
|
||||
// Debug.Log("EndCA");
|
||||
flags.ClearFlagBits(NBPostProcessFlags.FLAG_BIT_CHORATICABERRAT);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 径向速度扭曲
|
||||
|
||||
//径向速度扭曲相关
|
||||
private readonly int _distortVecProperty = Shader.PropertyToID("_SpeedDistortVec");
|
||||
private readonly int _distortVec2Property = Shader.PropertyToID("_SpeedDistortVec2");
|
||||
private bool _lastIsDistortSpeed = false;
|
||||
|
||||
public static bool isDistortScreenUVMode;
|
||||
|
||||
private bool _lastIsDistortScreenUVMode;
|
||||
|
||||
// [ShowInInspector]
|
||||
// [LabelText("径向扭曲开关")]
|
||||
// #if UNITY_EDITOR
|
||||
// [BinaryInt(8)]
|
||||
// #endif
|
||||
public static int distortSpeedToggles;
|
||||
|
||||
public static Texture2D distortTexture2D;
|
||||
|
||||
public static float distortSpeedIntensity = 0;
|
||||
public static float distortSpeedPosition = 0;
|
||||
public static float distortSpeedRange = 0;
|
||||
public static float distortSpeedMoveSpeedX = 0;
|
||||
public static float distortSpeedMoveSpeedY = 0;
|
||||
public static float distortTextureMidValue = 0;
|
||||
|
||||
private void InitDistortSpeed()
|
||||
{
|
||||
flags.SetFlagBits(NBPostProcessFlags.FLAG_BIT_DISTORT_SPEED);
|
||||
}
|
||||
|
||||
private void UpdateDistortSpeed()
|
||||
{
|
||||
if (_lastIsDistortScreenUVMode != isDistortScreenUVMode)
|
||||
{
|
||||
if (isDistortScreenUVMode)
|
||||
{
|
||||
flags.SetFlagBits(NBPostProcessFlags.FLAG_BIT_POST_DISTORT_SCREEN_UV);
|
||||
}
|
||||
else
|
||||
{
|
||||
flags.ClearFlagBits(NBPostProcessFlags.FLAG_BIT_POST_DISTORT_SCREEN_UV);
|
||||
}
|
||||
|
||||
_lastIsDistortScreenUVMode = isDistortScreenUVMode;
|
||||
}
|
||||
|
||||
Vector4 distortVec = new Vector4(distortSpeedIntensity, distortSpeedPosition, distortSpeedRange,
|
||||
distortTextureMidValue);
|
||||
Vector4 distortVec2 = new Vector4(distortSpeedMoveSpeedX, distortSpeedMoveSpeedY, 0, 0);
|
||||
material.SetVector(_distortVecProperty, distortVec);
|
||||
material.SetVector(_distortVec2Property, distortVec2);
|
||||
distortSpeedIntensity = 0;
|
||||
distortSpeedPosition = 0;
|
||||
distortSpeedRange = 0;
|
||||
distortSpeedMoveSpeedX = 0;
|
||||
distortSpeedMoveSpeedY = 0;
|
||||
}
|
||||
|
||||
private void EndDistortSpeed()
|
||||
{
|
||||
flags.ClearFlagBits(NBPostProcessFlags.FLAG_BIT_DISTORT_SPEED);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 径向模糊
|
||||
|
||||
// [ShowInInspector]
|
||||
// [LabelText("径向模糊开关")]
|
||||
// #if UNITY_EDITOR
|
||||
// [BinaryInt(8)]
|
||||
// #endif
|
||||
public static int radialBlurToggles = 0;
|
||||
private readonly int _radialBlurVecProperty = Shader.PropertyToID("_RadialBlurVec");
|
||||
public static float radialBlurIntensity = 0;
|
||||
public static float radialBlurPos = 0;
|
||||
public static float radialBlurRange = 0;
|
||||
public static int radialBlurSampleCount = 4;
|
||||
public static bool isRadialBlurByDistort = false;
|
||||
private bool _lastIsRadialBlurByDistort = false;
|
||||
|
||||
private bool _lastIsRadialBlur = false;
|
||||
|
||||
private void InitRadialBlur()
|
||||
{
|
||||
// Debug.Log("InitRB");
|
||||
flags.SetFlagBits(NBPostProcessFlags.FLAG_BIT_RADIALBLUR);
|
||||
}
|
||||
|
||||
private void UpdateRadialBlur()
|
||||
{
|
||||
if (_lastIsRadialBlurByDistort != isRadialBlurByDistort)
|
||||
{
|
||||
if (isRadialBlurByDistort)
|
||||
{
|
||||
flags.SetFlagBits(NBPostProcessFlags.FLAG_BIT_RADIALBLUR_BY_DISTORT);
|
||||
}
|
||||
else
|
||||
{
|
||||
flags.ClearFlagBits(NBPostProcessFlags.FLAG_BIT_RADIALBLUR_BY_DISTORT);
|
||||
}
|
||||
|
||||
_lastIsRadialBlurByDistort = isRadialBlurByDistort;
|
||||
}
|
||||
|
||||
Vector4 radialBlurVec = new Vector4(radialBlurIntensity * 0.1f / radialBlurSampleCount, radialBlurPos,
|
||||
radialBlurRange, radialBlurSampleCount);
|
||||
material.SetVector(_radialBlurVecProperty, radialBlurVec);
|
||||
radialBlurIntensity = 0;
|
||||
radialBlurSampleCount = 0;
|
||||
radialBlurPos = 0;
|
||||
radialBlurRange = 0;
|
||||
}
|
||||
|
||||
private void EndRadialBlur()
|
||||
{
|
||||
// Debug.Log("EndRB");
|
||||
flags.ClearFlagBits(NBPostProcessFlags.FLAG_BIT_RADIALBLUR);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 震屏
|
||||
|
||||
#if CINIMACHINE_3_0
|
||||
|
||||
public static int cameraShakeToggles = 0;
|
||||
|
||||
|
||||
private bool _lastIsCameraShake = false;
|
||||
public static float cameraShakeIntensity = 0;
|
||||
|
||||
private void UpdateCameraShake()
|
||||
{
|
||||
if (_perlin)
|
||||
{
|
||||
_perlin.AmplitudeGain = cameraShakeIntensity;
|
||||
}
|
||||
|
||||
cameraShakeIntensity = 0;
|
||||
// #if UNITY_EDITOR
|
||||
if (currentVirtualCamera)
|
||||
{
|
||||
CinemachineCore.SoloCamera = currentVirtualCamera;
|
||||
}
|
||||
// #endif
|
||||
// Debug.Log(_perlin.m_AmplitudeGain);
|
||||
}
|
||||
|
||||
private void EndCameraShake()
|
||||
{
|
||||
if (_perlin)
|
||||
{
|
||||
_perlin.AmplitudeGain = 0;
|
||||
}
|
||||
|
||||
CinemachineCore.SoloCamera = null;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
|
||||
#region 肌理叠加
|
||||
|
||||
//肌理图
|
||||
//注意,肌理图就是硬切,只有intensity可以做差值。
|
||||
// [ShowInInspector]
|
||||
// [LabelText("肌理开关")]
|
||||
// #if UNITY_EDITOR
|
||||
// [BinaryInt(8)]
|
||||
// #endif
|
||||
public static int overlayTextureToggles = 0;
|
||||
|
||||
private bool _lastIsOverlayTexture = false;
|
||||
|
||||
public static float overlayTextureIntensity = 0;
|
||||
|
||||
private readonly int _overlayTextureProperty = Shader.PropertyToID("_TextureOverlay");
|
||||
private readonly int _overlayTextureStProperty = Shader.PropertyToID("_TextureOverlay_ST");
|
||||
private readonly int _overlayTextureIntensityProperty = Shader.PropertyToID("_TextureOverlayIntensity");
|
||||
|
||||
private void InitOverlayTexture()
|
||||
{
|
||||
flags.SetFlagBits(NBPostProcessFlags.FLAG_BIT_OVERLAYTEXTURE);
|
||||
}
|
||||
|
||||
private void UpdateOverlayTexture()
|
||||
{
|
||||
material.SetFloat(_overlayTextureIntensityProperty, overlayTextureIntensity);
|
||||
overlayTextureIntensity = 0;
|
||||
}
|
||||
|
||||
private void EndOverlayTexture()
|
||||
{
|
||||
flags.ClearFlagBits(NBPostProcessFlags.FLAG_BIT_OVERLAYTEXTURE);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 黑白闪
|
||||
|
||||
// [ShowInInspector]
|
||||
// [LabelText("黑白闪开关")]
|
||||
// #if UNITY_EDITOR
|
||||
// [BinaryInt(8)]
|
||||
// #endif
|
||||
public static int flashToggles = 0;
|
||||
|
||||
private bool _lastIsFlash = false;
|
||||
|
||||
public static float flashDesaturateIntensity = 0;
|
||||
public static float flashGradientRange = 0;
|
||||
public static Vector4 flashTextureScaleOffset = new Vector4(1,1,0,0);
|
||||
public static Vector4 flashVec = new Vector4(0, 0);
|
||||
public static float flashTextureIntensity = 0.5f;
|
||||
public static float flashIntensity = 1;
|
||||
|
||||
public static float flashInvertIntensity = 0;
|
||||
|
||||
public static float flashContrast = 0;
|
||||
|
||||
public static Color flashColor = new Color(1, 1, 1, 1);
|
||||
public static Color blackFlashColor = new Color(0, 0, 0, 1);
|
||||
|
||||
private readonly int _flashIntensityProperty = Shader.PropertyToID("_FlashIntensity");
|
||||
private readonly int _flashDesaturateProperty = Shader.PropertyToID("_DeSaturateIntensity");
|
||||
private readonly int _flashInvertProperty = Shader.PropertyToID("_InvertIntensity");
|
||||
private readonly int _flashContrastProperty = Shader.PropertyToID("_Contrast");
|
||||
private readonly int _flashColorProperty = Shader.PropertyToID("_FlashColor");
|
||||
private readonly int _blackFlashColorProperty = Shader.PropertyToID("_BlackFlashColor");
|
||||
private readonly int _flashGradientRangeProp = Shader.PropertyToID("_FlashGradientRange");
|
||||
private readonly int _flashTextureScaleOffsetProp = Shader.PropertyToID("_FlashTexture_ST");
|
||||
private readonly int _flashVecProp = Shader.PropertyToID("_FlashVec");
|
||||
private readonly int _flashTextureIntensityProp = Shader.PropertyToID("_FlashTextureIntensity");
|
||||
|
||||
private void InitFlash()
|
||||
{
|
||||
flags.SetFlagBits(NBPostProcessFlags.FLAG_BIT_FLASH);
|
||||
}
|
||||
|
||||
private void UpdateFlash()
|
||||
{
|
||||
material.SetFloat(_flashDesaturateProperty, flashDesaturateIntensity);
|
||||
material.SetFloat(_flashInvertProperty, flashInvertIntensity);
|
||||
material.SetFloat(_flashContrastProperty, flashContrast);
|
||||
material.SetColor(_flashColorProperty, flashColor);
|
||||
material.SetColor(_blackFlashColorProperty, blackFlashColor);
|
||||
material.SetFloat(_flashGradientRangeProp, flashGradientRange);
|
||||
material.SetVector(_flashTextureScaleOffsetProp, flashTextureScaleOffset);
|
||||
material.SetVector(_flashVecProp, flashVec);
|
||||
material.SetFloat(_flashTextureIntensityProp, flashTextureIntensity);
|
||||
material.SetFloat(_flashIntensityProperty, flashIntensity);
|
||||
|
||||
flashDesaturateIntensity = 0;
|
||||
flashInvertIntensity = 0;
|
||||
flashContrast = 0;
|
||||
flashColor = Color.white;
|
||||
blackFlashColor = Color.black;
|
||||
flashGradientRange = 0;
|
||||
flashTextureScaleOffset = Vector4.zero;
|
||||
flashTextureIntensity = 0;
|
||||
flashVec = Vector4.zero;
|
||||
flashIntensity = 0;
|
||||
}
|
||||
|
||||
private void EndFlash()
|
||||
{
|
||||
flags.ClearFlagBits(NBPostProcessFlags.FLAG_BIT_FLASH);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 暗角
|
||||
|
||||
// [ShowInInspector]
|
||||
// [LabelText("暗角开关")]
|
||||
// #if UNITY_EDITOR
|
||||
// [BinaryInt(8)]
|
||||
// #endif
|
||||
public static int vignetteToggles = 0;
|
||||
|
||||
private bool _lastIsVignette;
|
||||
|
||||
public static float vignetteIntensity = 0f;
|
||||
public static float vignetteRoundness = 0f;
|
||||
public static float vignetteSmothness = 0f;
|
||||
public static float vignetteFill = 0f;
|
||||
|
||||
private readonly int _vignetteVecProperty = Shader.PropertyToID("_VignetteVec");
|
||||
|
||||
private void InitVignette()
|
||||
{
|
||||
flags.SetFlagBits(NBPostProcessFlags.FLAG_BIT_VIGNETTE);
|
||||
}
|
||||
|
||||
|
||||
private void UpdateVignette()
|
||||
{
|
||||
Vector4 vignetteVec = new Vector4(vignetteIntensity, vignetteRoundness, vignetteSmothness, vignetteFill);
|
||||
material.SetVector(_vignetteVecProperty, vignetteVec);
|
||||
vignetteIntensity = 0;
|
||||
vignetteRoundness = 0;
|
||||
vignetteSmothness = 0;
|
||||
vignetteFill = 0;
|
||||
}
|
||||
|
||||
private void EndVignette()
|
||||
{
|
||||
flags.ClearFlagBits(NBPostProcessFlags.FLAG_BIT_VIGNETTE);
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
#if UNITY_EDITOR
|
||||
void EditorUpdate()
|
||||
{
|
||||
if (!Application.isPlaying)
|
||||
{
|
||||
LateUpdate(); //每帧Update会导致SceneView闪
|
||||
}
|
||||
}
|
||||
|
||||
public void ReRegistEditorUpdate()
|
||||
{
|
||||
EditorApplication.update -= EditorUpdate;
|
||||
EditorApplication.update += EditorUpdate;
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fe30e455c04f33342bb3d1c227855682
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,100 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering;
|
||||
using UnityEngine.Rendering.Universal;
|
||||
using System.Collections.Generic;
|
||||
#if UNIVERSAL_RP_17_0_OR_NEWER
|
||||
using UnityEngine.Rendering.RenderGraphModule;
|
||||
#endif
|
||||
|
||||
namespace NBShader
|
||||
{
|
||||
public class RenderCameraOpaqueDistortObjectPass: ScriptableRenderPass
|
||||
{
|
||||
private ProfilingSampler _profilingSampler = new ProfilingSampler("RenderCameraOpaqueDistortObject");
|
||||
|
||||
private FilteringSettings _Filtering;
|
||||
private readonly List<ShaderTagId> _shaderTag = new List<ShaderTagId>()
|
||||
{
|
||||
// new ShaderTagId("UniversalForward"),
|
||||
// new ShaderTagId("SRPDefaultUnlit"),
|
||||
// new ShaderTagId("UniversalForwardOnly")
|
||||
new ShaderTagId("NBCameraOpaqueDistortPass")
|
||||
};
|
||||
|
||||
#if UNIVERSAL_RP_17_0_OR_NEWER
|
||||
private class RenderGraphPassData
|
||||
{
|
||||
public RendererListHandle rendererListHandle;
|
||||
}
|
||||
|
||||
private static bool IsSupportedCamera(CameraType cameraType)
|
||||
{
|
||||
return cameraType == CameraType.Game || cameraType == CameraType.SceneView;
|
||||
}
|
||||
|
||||
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
|
||||
{
|
||||
UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
|
||||
if (!IsSupportedCamera(cameraData.cameraType))
|
||||
return;
|
||||
|
||||
UniversalResourceData resourceData = frameData.Get<UniversalResourceData>();
|
||||
if (!resourceData.activeColorTexture.IsValid())
|
||||
return;
|
||||
|
||||
UniversalRenderingData universalRenderingData = frameData.Get<UniversalRenderingData>();
|
||||
UniversalLightData lightData = frameData.Get<UniversalLightData>();
|
||||
|
||||
using (var builder = renderGraph.AddRasterRenderPass<RenderGraphPassData>("RenderCameraOpaqueDistortObject", out var passData))
|
||||
{
|
||||
DrawingSettings drawingSettings = RenderingUtils.CreateDrawingSettings(
|
||||
_shaderTag,
|
||||
universalRenderingData,
|
||||
cameraData,
|
||||
lightData,
|
||||
cameraData.defaultOpaqueSortFlags);
|
||||
FilteringSettings filteringSettings = new FilteringSettings(RenderQueueRange.all);
|
||||
RendererListParams rendererListParameters = new RendererListParams(
|
||||
universalRenderingData.cullResults,
|
||||
drawingSettings,
|
||||
filteringSettings);
|
||||
|
||||
passData.rendererListHandle = renderGraph.CreateRendererList(rendererListParameters);
|
||||
builder.UseRendererList(passData.rendererListHandle);
|
||||
builder.SetRenderAttachment(resourceData.activeColorTexture, 0, AccessFlags.ReadWrite);
|
||||
|
||||
if (resourceData.activeDepthTexture.IsValid())
|
||||
builder.SetRenderAttachmentDepth(resourceData.activeDepthTexture, AccessFlags.ReadWrite);
|
||||
|
||||
builder.SetRenderFunc(static (RenderGraphPassData data, RasterGraphContext context) =>
|
||||
{
|
||||
context.cmd.DrawRendererList(data.rendererListHandle);
|
||||
});
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !UNITY_6000_3_OR_NEWER || (URP_COMPATIBILITY_MODE && !UNITY_6000_4_OR_NEWER)
|
||||
#pragma warning disable CS0618, CS0672
|
||||
public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
|
||||
{
|
||||
_Filtering = new FilteringSettings(RenderQueueRange.all);
|
||||
}
|
||||
|
||||
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
|
||||
{
|
||||
if (!(renderingData.cameraData.cameraType == CameraType.Game || renderingData.cameraData.cameraType == CameraType.SceneView))
|
||||
return;
|
||||
var DisturbanceDraw = CreateDrawingSettings(_shaderTag, ref renderingData, renderingData.cameraData.defaultOpaqueSortFlags);
|
||||
CommandBuffer cmd = CommandBufferPool.Get();
|
||||
using (new ProfilingScope(cmd, _profilingSampler))
|
||||
{
|
||||
context.DrawRenderers(renderingData.cullResults, ref DisturbanceDraw, ref _Filtering);
|
||||
}
|
||||
context.ExecuteCommandBuffer(cmd);
|
||||
CommandBufferPool.Release(cmd);
|
||||
}
|
||||
#pragma warning restore CS0618, CS0672
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d9bf1337892f42c489f6d9e553271b59
|
||||
timeCreated: 1757141058
|
||||
307
Packages/NB_FX/NBPostProcessing/Runtime/ScreenColorRenderPass.cs
Normal file
307
Packages/NB_FX/NBPostProcessing/Runtime/ScreenColorRenderPass.cs
Normal file
@@ -0,0 +1,307 @@
|
||||
#if !UNITY_6000_3_OR_NEWER || (URP_COMPATIBILITY_MODE && !UNITY_6000_4_OR_NEWER)
|
||||
#define NB_URP_COMPATIBILITY_PATH
|
||||
#endif
|
||||
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering;
|
||||
using UnityEngine.Rendering.Universal;
|
||||
using System.Reflection;
|
||||
#if UNIVERSAL_RP_17_0_OR_NEWER
|
||||
using UnityEngine.Rendering.RenderGraphModule;
|
||||
using UnityEngine.Rendering.RenderGraphModule.Util;
|
||||
#endif
|
||||
|
||||
namespace NBShader
|
||||
{
|
||||
public class ScreenColorRenderPass : ScriptableRenderPass
|
||||
{
|
||||
#if UNIVERSAL_RP_13_1_2_OR_NEWER
|
||||
private RTHandle _screenColorHandle;
|
||||
private RTHandle _tempRTHandle;
|
||||
#else
|
||||
private RenderTargetIdentifier _screenColorHandle;
|
||||
private static readonly int _screenColorRTID = Shader.PropertyToID("_screenColorRT");
|
||||
private RenderTargetIdentifier _tempRTHandle = new RenderTargetIdentifier(_tempRTID);
|
||||
private static readonly int _tempRTID = Shader.PropertyToID("CopyColorRT");
|
||||
#endif
|
||||
private ProfilingSampler _profilingSampler;
|
||||
private readonly Downsampling _downSampling;
|
||||
readonly Material _material;
|
||||
private static readonly int CameraTexture = Shader.PropertyToID("_CameraTexture");
|
||||
private static readonly int SampleOffset = Shader.PropertyToID("_SampleOffset");
|
||||
private static readonly int ScreenColorCopy = Shader.PropertyToID("_ScreenColorCopy1");
|
||||
|
||||
public ScreenColorRenderPass(Material material, Downsampling downSampling)
|
||||
{
|
||||
_material = material;
|
||||
_downSampling = downSampling;
|
||||
#if UNIVERSAL_RP_17_0_OR_NEWER
|
||||
requiresIntermediateTexture = true;
|
||||
#endif
|
||||
}
|
||||
|
||||
private static void DisableMipMaps(ref RenderTextureDescriptor descriptor)
|
||||
{
|
||||
descriptor.autoGenerateMips = false;
|
||||
descriptor.useMipMap = false;
|
||||
}
|
||||
|
||||
#if UNIVERSAL_RP_17_0_OR_NEWER
|
||||
private class GlobalTexturePassData
|
||||
{
|
||||
public TextureHandle texture;
|
||||
public int nameID;
|
||||
}
|
||||
|
||||
private static bool IsSupportedCamera(CameraType cameraType)
|
||||
{
|
||||
return cameraType == CameraType.Game || cameraType == CameraType.SceneView;
|
||||
}
|
||||
|
||||
private static void SetGlobalTextureAfterPass(RenderGraph renderGraph, TextureHandle texture, int nameID, string passName)
|
||||
{
|
||||
using (var builder = renderGraph.AddRasterRenderPass<GlobalTexturePassData>(passName, out var passData))
|
||||
{
|
||||
passData.texture = texture;
|
||||
passData.nameID = nameID;
|
||||
builder.UseTexture(texture, AccessFlags.Read);
|
||||
builder.AllowPassCulling(false);
|
||||
builder.AllowGlobalStateModification(true);
|
||||
builder.SetGlobalTextureAfterPass(texture, nameID);
|
||||
builder.SetRenderFunc(static (GlobalTexturePassData data, RasterGraphContext context) =>
|
||||
{
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void ApplyDownsampling(ref TextureDesc descriptor)
|
||||
{
|
||||
switch (_downSampling)
|
||||
{
|
||||
case Downsampling._2xBilinear:
|
||||
descriptor.width = Mathf.Max(1, descriptor.width / 2);
|
||||
descriptor.height = Mathf.Max(1, descriptor.height / 2);
|
||||
break;
|
||||
case Downsampling._4xBilinear:
|
||||
case Downsampling._4xBox:
|
||||
descriptor.width = Mathf.Max(1, descriptor.width / 4);
|
||||
descriptor.height = Mathf.Max(1, descriptor.height / 4);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private int GetDownsamplePassIndex()
|
||||
{
|
||||
return _downSampling == Downsampling._4xBox ? 1 : 0;
|
||||
}
|
||||
|
||||
private static void DisableMipMaps(ref TextureDesc descriptor)
|
||||
{
|
||||
descriptor.autoGenerateMips = false;
|
||||
descriptor.useMipMap = false;
|
||||
}
|
||||
|
||||
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
|
||||
{
|
||||
UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
|
||||
if (!IsSupportedCamera(cameraData.cameraType) || _material == null)
|
||||
return;
|
||||
|
||||
UniversalResourceData resourceData = frameData.Get<UniversalResourceData>();
|
||||
TextureHandle source = resourceData.activeColorTexture;
|
||||
if (!source.IsValid())
|
||||
return;
|
||||
|
||||
TextureDesc descriptor = renderGraph.GetTextureDesc(source);
|
||||
descriptor.name = "CopyColorRT";
|
||||
descriptor.clearBuffer = false;
|
||||
descriptor.depthBufferBits = DepthBits.None;
|
||||
DisableMipMaps(ref descriptor);
|
||||
ApplyDownsampling(ref descriptor);
|
||||
|
||||
TextureHandle destination = renderGraph.CreateTexture(descriptor);
|
||||
|
||||
if (_downSampling == Downsampling._4xBox)
|
||||
_material.SetFloat(SampleOffset, 2);
|
||||
|
||||
RenderGraphUtils.BlitMaterialParameters blitParameters =
|
||||
new RenderGraphUtils.BlitMaterialParameters(source, destination, _material, GetDownsamplePassIndex());
|
||||
blitParameters.sourceTexturePropertyID = CameraTexture;
|
||||
|
||||
renderGraph.AddBlitPass(blitParameters, "ScreenColorRender");
|
||||
SetGlobalTextureAfterPass(renderGraph, destination, ScreenColorCopy, "Set Screen Color Copy");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#if UNIVERSAL_RP_13_1_2_OR_NEWER
|
||||
#if NB_URP_COMPATIBILITY_PATH
|
||||
#pragma warning disable CS0618, CS0672
|
||||
public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
|
||||
{
|
||||
ConfigureTarget(_screenColorHandle);
|
||||
|
||||
}
|
||||
#pragma warning restore CS0618, CS0672
|
||||
#endif
|
||||
|
||||
public void SetUp(RTHandle colorHandle)
|
||||
{
|
||||
#if NB_URP_COMPATIBILITY_PATH
|
||||
#pragma warning disable CS0618
|
||||
_profilingSampler ??= new ProfilingSampler("ScreenColorRender");
|
||||
_screenColorHandle = colorHandle;
|
||||
RenderTextureDescriptor descriptor = _screenColorHandle.rt.descriptor;
|
||||
DisableMipMaps(ref descriptor);
|
||||
switch (_downSampling)
|
||||
{
|
||||
case Downsampling._2xBilinear:
|
||||
descriptor.width /= 2;
|
||||
descriptor.height /= 2;
|
||||
break;
|
||||
case Downsampling._4xBilinear:
|
||||
descriptor.width /= 4;
|
||||
descriptor.height /= 4;
|
||||
break;
|
||||
case Downsampling._4xBox:
|
||||
descriptor.width /= 4;
|
||||
descriptor.height /= 4;
|
||||
break;
|
||||
}
|
||||
RenderingUtils.ReAllocateIfNeeded(ref _tempRTHandle, descriptor,name:"CopyColorRT");
|
||||
#pragma warning restore CS0618
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#else
|
||||
#if NB_URP_COMPATIBILITY_PATH
|
||||
|
||||
FieldInfo cameraColorAttachment = typeof(UniversalRenderer).GetField("m_ActiveCameraColorAttachment", BindingFlags.NonPublic|BindingFlags.Instance);
|
||||
|
||||
#pragma warning disable CS0618, CS0672
|
||||
public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
|
||||
{
|
||||
|
||||
var renderer = (UniversalRenderer)renderingData.cameraData.renderer;
|
||||
|
||||
// cmd.SetGlobalTexture(_screenColorRTID,_screenColorHandle);
|
||||
SetUpCopyColorRT(renderer,renderingData.cameraData.cameraTargetDescriptor,cmd);
|
||||
ConfigureTarget(_tempRTHandle);
|
||||
ConfigureClear(ClearFlag.Color, Color.clear);
|
||||
}
|
||||
|
||||
public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
|
||||
{
|
||||
}
|
||||
#pragma warning restore CS0618, CS0672
|
||||
|
||||
public void SetUp(ScriptableRenderer renderer)
|
||||
{
|
||||
RenderTargetHandle value = (RenderTargetHandle)cameraColorAttachment.GetValue(renderer);
|
||||
_screenColorHandle = value.Identifier();
|
||||
// _screenColorHandle = colorTarget;
|
||||
}
|
||||
|
||||
public void SetUpCopyColorRT(ScriptableRenderer renderer,RenderTextureDescriptor descriptor ,CommandBuffer cmd)
|
||||
{
|
||||
DisableMipMaps(ref descriptor);
|
||||
switch (_downSampling)
|
||||
{
|
||||
case Downsampling._2xBilinear:
|
||||
descriptor.width /= 2;
|
||||
descriptor.height /= 2;
|
||||
break;
|
||||
case Downsampling._4xBilinear:
|
||||
descriptor.width /= 4;
|
||||
descriptor.height /= 4;
|
||||
break;
|
||||
case Downsampling._4xBox:
|
||||
descriptor.width /= 4;
|
||||
descriptor.height /= 4;
|
||||
break;
|
||||
}
|
||||
cmd.GetTemporaryRT( _tempRTID, descriptor,FilterMode.Bilinear);
|
||||
}
|
||||
|
||||
public override void OnCameraCleanup(CommandBuffer cmd)
|
||||
{
|
||||
cmd.ReleaseTemporaryRT(_tempRTID);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if NB_URP_COMPATIBILITY_PATH
|
||||
#pragma warning disable CS0618, CS0672
|
||||
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
|
||||
{
|
||||
if (!(renderingData.cameraData.cameraType == CameraType.Game || renderingData.cameraData.cameraType == CameraType.SceneView))
|
||||
return;
|
||||
if (_material == null)
|
||||
return;
|
||||
CommandBuffer cmd = CommandBufferPool.Get();
|
||||
|
||||
using (new ProfilingScope(cmd, _profilingSampler))
|
||||
{
|
||||
#if UNIVERSAL_RP_13_1_2_OR_NEWER
|
||||
|
||||
_material.SetTexture(CameraTexture, _screenColorHandle);
|
||||
cmd.SetRenderTarget((RenderTargetIdentifier)_tempRTHandle);
|
||||
switch (_downSampling)
|
||||
{
|
||||
case Downsampling._2xBilinear:
|
||||
|
||||
Blitter.BlitTexture(cmd, _screenColorHandle, Vector2.one, _material, 0);
|
||||
break;
|
||||
case Downsampling._4xBilinear:
|
||||
Blitter.BlitTexture(cmd, _screenColorHandle, Vector2.one, _material, 0);
|
||||
break;
|
||||
case Downsampling._4xBox:
|
||||
_material.SetFloat(SampleOffset,2);
|
||||
Blitter.BlitTexture(cmd, _screenColorHandle, Vector2.one, _material, 1);
|
||||
break;
|
||||
default:
|
||||
Blitter.BlitTexture(cmd, _screenColorHandle, Vector2.one, _material, 0);
|
||||
break;
|
||||
}
|
||||
#else
|
||||
cmd.SetGlobalTexture(_screenColorRTID,_screenColorHandle);
|
||||
|
||||
_material.SetTexture(CameraTexture,Shader.GetGlobalTexture(_screenColorRTID));
|
||||
cmd.SetRenderTarget(_tempRTHandle);
|
||||
switch (_downSampling)
|
||||
{
|
||||
case Downsampling._2xBilinear:
|
||||
cmd.DrawMesh(RenderingUtils.fullscreenMesh, Matrix4x4.identity, _material, 0,0);
|
||||
break;
|
||||
case Downsampling._4xBilinear:
|
||||
cmd.DrawMesh(RenderingUtils.fullscreenMesh, Matrix4x4.identity, _material, 0,0);
|
||||
break;
|
||||
case Downsampling._4xBox:
|
||||
_material.SetFloat(SampleOffset,2);
|
||||
cmd.DrawMesh(RenderingUtils.fullscreenMesh, Matrix4x4.identity, _material, 0,1);
|
||||
break;
|
||||
default:
|
||||
cmd.DrawMesh(RenderingUtils.fullscreenMesh, Matrix4x4.identity, _material, 0,0);
|
||||
break;
|
||||
}
|
||||
|
||||
#endif
|
||||
cmd.SetGlobalTexture(ScreenColorCopy, _tempRTHandle);
|
||||
}
|
||||
|
||||
context.ExecuteCommandBuffer(cmd);
|
||||
cmd.Clear();
|
||||
CommandBufferPool.Release(cmd);
|
||||
}
|
||||
#pragma warning restore CS0618, CS0672
|
||||
#endif
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
#if UNIVERSAL_RP_13_1_2_OR_NEWER && NB_URP_COMPATIBILITY_PATH
|
||||
_tempRTHandle?.Release();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ff8358dc3f3531d4c92a43a49d07f36c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "com.xuanxuan.nb.postprocessing",
|
||||
"rootNamespace": "",
|
||||
"references": [
|
||||
"GUID:df380645f10b7bc4b97d4f5eb6303d95",
|
||||
"GUID:15fc0a57446b3144c949da3e2b9737a9",
|
||||
"GUID:4307f53044263cf4b835bd812fc161a4",
|
||||
"GUID:8f9e4d586616f13449cfeb86c5f704c2"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [
|
||||
{
|
||||
"name": "com.unity.cinemachine",
|
||||
"expression": "3.0",
|
||||
"define": "CINIMACHINE_3_0"
|
||||
},
|
||||
{
|
||||
"name": "com.unity.render-pipelines.universal",
|
||||
"expression": "13.1.2",
|
||||
"define": "UNIVERSAL_RP_13_1_2_OR_NEWER"
|
||||
},
|
||||
{
|
||||
"name": "com.unity.render-pipelines.universal",
|
||||
"expression": "17.0.0",
|
||||
"define": "UNIVERSAL_RP_17_0_OR_NEWER"
|
||||
}
|
||||
],
|
||||
"noEngineReferences": false
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a1f23b61b189bd949adfd0f7a353734f
|
||||
AssemblyDefinitionImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user