This commit is contained in:
SoulliesOfficial
2026-07-17 17:46:16 -04:00
parent b00ac27e3a
commit 40fa80cd70
1178 changed files with 51090 additions and 0 deletions

View File

@@ -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
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 1e411db03f9f4d85aa8a5e485158c961
timeCreated: 1757141532

View 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();
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d5a1f9350d8fc2c46a372955ef0e73b5
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 2a20551d205e487f89b91897e9cb7a43
timeCreated: 1757141611

View File

@@ -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;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: be6a95b97f4bc3846bdada66138f6da1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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
}
}

View File

@@ -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:

View 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
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: fe30e455c04f33342bb3d1c227855682
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: d9bf1337892f42c489f6d9e553271b59
timeCreated: 1757141058

View 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
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ff8358dc3f3531d4c92a43a49d07f36c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: a1f23b61b189bd949adfd0f7a353734f
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant: