mirror of
https://github.com/RHeavenStudioPlus/HeavenStudioPlus.git
synced 2024-11-10 11:45:09 +00:00
152 lines
5.5 KiB
C#
152 lines
5.5 KiB
C#
|
|
|||
|
//----------------------------------------------------------------------------------------------------------
|
|||
|
// X-PostProcessing Library
|
|||
|
// https://github.com/QianMo/X-PostProcessing-Library
|
|||
|
// Copyright (C) 2020 QianMo. All rights reserved.
|
|||
|
// Licensed under the MIT License
|
|||
|
// You may not use this file except in compliance with the License.You may obtain a copy of the License at
|
|||
|
// http://opensource.org/licenses/MIT
|
|||
|
//----------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
//reference : https://github.com/keijiro/KinoGlitch
|
|||
|
|
|||
|
using System;
|
|||
|
using System.IO;
|
|||
|
using UnityEngine;
|
|||
|
using UnityEngine.Rendering;
|
|||
|
using UnityEngine.Rendering.PostProcessing;
|
|||
|
|
|||
|
namespace XPostProcessing
|
|||
|
{
|
|||
|
[Serializable]
|
|||
|
[PostProcess(typeof(GlitchDigitalStripeRenderer), PostProcessEvent.AfterStack, "X-PostProcessing/Glitch/DigitalStripe")]
|
|||
|
public class GlitchDigitalStripe : PostProcessEffectSettings
|
|||
|
{
|
|||
|
|
|||
|
[Range(0.0f, 1.0f)]
|
|||
|
public FloatParameter intensity = new FloatParameter { value = 0.25f };
|
|||
|
|
|||
|
[Range(1, 10)]
|
|||
|
public IntParameter frequncy = new IntParameter { value = 3 };
|
|||
|
|
|||
|
[Range(0f, 0.99f)]
|
|||
|
public FloatParameter stripeLength = new FloatParameter { value = 0.89f };
|
|||
|
|
|||
|
[Range(8, 256)]
|
|||
|
public IntParameter noiseTextureWidth = new IntParameter { value = 20 };
|
|||
|
|
|||
|
[Range(8, 256)]
|
|||
|
public IntParameter noiseTextureHeight = new IntParameter { value = 20 };
|
|||
|
|
|||
|
public BoolParameter needStripColorAdjust = new BoolParameter { value = false };
|
|||
|
|
|||
|
[ColorUsageAttribute(true, true, 0f, 20f, 0.125f, 3f)]
|
|||
|
public ColorParameter StripColorAdjustColor = new ColorParameter { value = new Color(0.1f, 0.1f, 0.1f) };
|
|||
|
|
|||
|
[Range(0, 10)]
|
|||
|
public FloatParameter StripColorAdjustIndensity = new FloatParameter { value = 2f };
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public sealed class GlitchDigitalStripeRenderer : PostProcessEffectRenderer<GlitchDigitalStripe>
|
|||
|
{
|
|||
|
private const string PROFILER_TAG = "X-GlitchDigitalStripe";
|
|||
|
private Shader shader;
|
|||
|
Texture2D _noiseTexture;
|
|||
|
RenderTexture _trashFrame1;
|
|||
|
RenderTexture _trashFrame2;
|
|||
|
|
|||
|
public override void Init()
|
|||
|
{
|
|||
|
shader = Shader.Find("Hidden/X-PostProcessing/Glitch/DigitalStripe");
|
|||
|
}
|
|||
|
|
|||
|
public override void Release()
|
|||
|
{
|
|||
|
base.Release();
|
|||
|
}
|
|||
|
|
|||
|
static class ShaderIDs
|
|||
|
{
|
|||
|
internal static readonly int indensity = Shader.PropertyToID("_Indensity");
|
|||
|
internal static readonly int noiseTex = Shader.PropertyToID("_NoiseTex");
|
|||
|
internal static readonly int StripColorAdjustColor = Shader.PropertyToID("_StripColorAdjustColor");
|
|||
|
internal static readonly int StripColorAdjustIndensity = Shader.PropertyToID("_StripColorAdjustIndensity");
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
void UpdateNoiseTexture(int frame, int noiseTextureWidth, int noiseTextureHeight, float stripLength)
|
|||
|
{
|
|||
|
int frameCount = Time.frameCount;
|
|||
|
if (frameCount % frame != 0)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
_noiseTexture = new Texture2D(noiseTextureWidth, noiseTextureHeight, TextureFormat.ARGB32, false);
|
|||
|
_noiseTexture.wrapMode = TextureWrapMode.Clamp;
|
|||
|
_noiseTexture.filterMode = FilterMode.Point;
|
|||
|
|
|||
|
_trashFrame1 = new RenderTexture(Screen.width, Screen.height, 0);
|
|||
|
_trashFrame2 = new RenderTexture(Screen.width, Screen.height, 0);
|
|||
|
_trashFrame1.hideFlags = HideFlags.DontSave;
|
|||
|
_trashFrame2.hideFlags = HideFlags.DontSave;
|
|||
|
|
|||
|
Color32 color = XPostProcessingUtility.RandomColor();
|
|||
|
|
|||
|
for (int y = 0; y < _noiseTexture.height; y++)
|
|||
|
{
|
|||
|
for (int x = 0; x < _noiseTexture.width; x++)
|
|||
|
{
|
|||
|
//随机值若大于给定strip随机阈值,重新随机颜色
|
|||
|
if (UnityEngine.Random.value > stripLength)
|
|||
|
{
|
|||
|
color = XPostProcessingUtility.RandomColor();
|
|||
|
}
|
|||
|
//设置贴图像素值
|
|||
|
_noiseTexture.SetPixel(x, y, color);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
_noiseTexture.Apply();
|
|||
|
|
|||
|
var bytes = _noiseTexture.EncodeToPNG();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public override void Render(PostProcessRenderContext context)
|
|||
|
{
|
|||
|
CommandBuffer cmd = context.command;
|
|||
|
PropertySheet sheet = context.propertySheets.Get(shader);
|
|||
|
cmd.BeginSample(PROFILER_TAG);
|
|||
|
|
|||
|
UpdateNoiseTexture(settings.frequncy, settings.noiseTextureWidth,settings.noiseTextureHeight, settings.stripeLength);
|
|||
|
|
|||
|
sheet.properties.SetFloat(ShaderIDs.indensity, settings.intensity);
|
|||
|
|
|||
|
if (_noiseTexture != null)
|
|||
|
{
|
|||
|
sheet.properties.SetTexture(ShaderIDs.noiseTex, _noiseTexture);
|
|||
|
}
|
|||
|
|
|||
|
if (settings.needStripColorAdjust == true)
|
|||
|
{
|
|||
|
sheet.EnableKeyword("NEED_TRASH_FRAME");
|
|||
|
sheet.properties.SetColor(ShaderIDs.StripColorAdjustColor, settings.StripColorAdjustColor);
|
|||
|
sheet.properties.SetFloat(ShaderIDs.StripColorAdjustIndensity, settings.StripColorAdjustIndensity);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
sheet.DisableKeyword("NEED_TRASH_FRAME");
|
|||
|
}
|
|||
|
|
|||
|
context.command.BlitFullscreenTriangle(context.source, context.destination, sheet, 0);
|
|||
|
cmd.EndSample(PROFILER_TAG);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|