mirror of
https://github.com/RHeavenStudioPlus/HeavenStudioPlus.git
synced 2024-11-10 03:35:10 +00:00
f14d2a423f
* Super Retro VFX! * Updated Screen Jump default * also airboarder works now --------- Co-authored-by: minenice55 <star.elementa@gmail.com>
185 lines
5.5 KiB
Text
185 lines
5.5 KiB
Text
|
||
//----------------------------------------------------------------------------------------------------------
|
||
// 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
|
||
//----------------------------------------------------------------------------------------------------------
|
||
|
||
Shader "Hidden/X-PostProcessing/Glitch/LineBlock"
|
||
{
|
||
HLSLINCLUDE
|
||
|
||
#include "../../../Shaders/StdLib.hlsl"
|
||
#include "../../../Shaders/XPostProcessing.hlsl"
|
||
|
||
#pragma shader_feature USING_FREQUENCY_INFINITE
|
||
|
||
uniform half4 _Params;
|
||
uniform half4 _Params2;
|
||
|
||
#define _Frequency _Params.x
|
||
#define _TimeX _Params.y
|
||
#define _Amount _Params.z
|
||
#define _Offset _Params2.x
|
||
#define _LinesWidth _Params2.y
|
||
#define _Alpha _Params2.z
|
||
|
||
float randomNoise(float2 c)
|
||
{
|
||
return frac(sin(dot(c.xy, float2(12.9898, 78.233))) * 43758.5453);
|
||
}
|
||
|
||
float trunc(float x, float num_levels)
|
||
{
|
||
return floor(x * num_levels) / num_levels;
|
||
}
|
||
|
||
float2 trunc(float2 x, float2 num_levels)
|
||
{
|
||
return floor(x * num_levels) / num_levels;
|
||
}
|
||
|
||
float3 rgb2yuv(float3 rgb)
|
||
{
|
||
float3 yuv;
|
||
yuv.x = dot(rgb, float3(0.299, 0.587, 0.114));
|
||
yuv.y = dot(rgb, float3(-0.14713, -0.28886, 0.436));
|
||
yuv.z = dot(rgb, float3(0.615, -0.51499, -0.10001));
|
||
return yuv;
|
||
}
|
||
|
||
float3 yuv2rgb(float3 yuv)
|
||
{
|
||
float3 rgb;
|
||
rgb.r = yuv.x + yuv.z * 1.13983;
|
||
rgb.g = yuv.x + dot(float2(-0.39465, -0.58060), yuv.yz);
|
||
rgb.b = yuv.x + yuv.y * 2.03211;
|
||
return rgb;
|
||
}
|
||
|
||
|
||
float4 Frag_Horizontal(VaryingsDefault i): SV_Target
|
||
{
|
||
float2 uv = i.texcoord;
|
||
|
||
half strength = 0;
|
||
#if USING_FREQUENCY_INFINITE
|
||
strength = 10;
|
||
#else
|
||
strength = 0.5 + 0.5 * cos(_TimeX * _Frequency);
|
||
#endif
|
||
|
||
_TimeX *= strength;
|
||
|
||
// [1] 生成随机强度梯度线条
|
||
float truncTime = trunc(_TimeX, 4.0);
|
||
float uv_trunc = randomNoise(trunc(uv.yy, float2(8, 8)) + 100.0 * truncTime);
|
||
float uv_randomTrunc = 6.0 * trunc(_TimeX, 24.0 * uv_trunc);
|
||
|
||
// [2] 生成随机非均匀宽度线条
|
||
float blockLine_random = 0.5 * randomNoise(trunc(uv.yy + uv_randomTrunc, float2(8 * _LinesWidth, 8 * _LinesWidth)));
|
||
blockLine_random += 0.5 * randomNoise(trunc(uv.yy + uv_randomTrunc, float2(7, 7)));
|
||
blockLine_random = blockLine_random * 2.0 - 1.0;
|
||
blockLine_random = sign(blockLine_random) * saturate((abs(blockLine_random) - _Amount) / (0.4));
|
||
blockLine_random = lerp(0, blockLine_random, _Offset);
|
||
|
||
|
||
// [3] 生成源色调的blockLine Glitch
|
||
float2 uv_blockLine = uv;
|
||
uv_blockLine = saturate(uv_blockLine + float2(0.1 * blockLine_random, 0));
|
||
float4 blockLineColor = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, abs(uv_blockLine));
|
||
|
||
// [4] 将RGB转到YUV空间,并做色调偏移
|
||
// RGB -> YUV
|
||
float3 blockLineColor_yuv = rgb2yuv(blockLineColor.rgb);
|
||
// adjust Chrominance | 色度
|
||
blockLineColor_yuv.y /= 1.0 - 3.0 * abs(blockLine_random) * saturate(0.5 - blockLine_random);
|
||
// adjust Chroma | 浓度
|
||
blockLineColor_yuv.z += 0.125 * blockLine_random * saturate(blockLine_random - 0.5);
|
||
float3 blockLineColor_rgb = yuv2rgb(blockLineColor_yuv);
|
||
|
||
|
||
// [5] 与源场景图进行混合
|
||
float4 sceneColor = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoord);
|
||
return lerp(sceneColor, float4(blockLineColor_rgb, blockLineColor.a), _Alpha);
|
||
}
|
||
|
||
float4 Frag_Vertical(VaryingsDefault i): SV_Target
|
||
{
|
||
float2 uv = i.texcoord;
|
||
|
||
half strength = 0;
|
||
#if USING_FREQUENCY_INFINITE
|
||
strength = 10;
|
||
#else
|
||
strength = 0.5 + 0.5 * cos(_TimeX * _Frequency);
|
||
#endif
|
||
|
||
_TimeX *= strength;
|
||
|
||
// [1] 生成随机均匀宽度线条
|
||
float truncTime = trunc(_TimeX, 4.0);
|
||
float uv_trunc = randomNoise(trunc(uv.xx, float2(8, 8)) + 100.0 * truncTime);
|
||
float uv_randomTrunc = 6.0 * trunc(_TimeX, 24.0 * uv_trunc);
|
||
|
||
// [2] 生成随机非均匀宽度线条 | Generate Random inhomogeneous Block Line
|
||
float blockLine_random = 0.5 * randomNoise(trunc(uv.xx + uv_randomTrunc, float2(8 * _LinesWidth, 8 * _LinesWidth)));
|
||
blockLine_random += 0.5 * randomNoise(trunc(uv.xx + uv_randomTrunc, float2(7, 7)));
|
||
blockLine_random = blockLine_random * 2.0 - 1.0;
|
||
blockLine_random = sign(blockLine_random) * saturate((abs(blockLine_random) - _Amount) / (0.4));
|
||
blockLine_random = lerp(0, blockLine_random, _Offset);
|
||
|
||
// [3] 生成源色调的blockLine Glitch
|
||
float2 uv_blockLine = uv;
|
||
uv_blockLine = saturate(uv_blockLine + float2(0, 0.1 * blockLine_random));
|
||
float4 blockLineColor = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, abs(uv_blockLine));
|
||
|
||
// [4] 将RGB转到YUV空间,并做色调偏移
|
||
// RGB -> YUV
|
||
float3 blockLineColor_yuv = rgb2yuv(blockLineColor.rgb);
|
||
// adjust Chrominance | 色度
|
||
blockLineColor_yuv.y /= 1.0 - 3.0 * abs(blockLine_random) * saturate(0.5 - blockLine_random);
|
||
// adjust Chroma | 浓度
|
||
blockLineColor_yuv.z += 0.125 * blockLine_random * saturate(blockLine_random - 0.5);
|
||
float3 blockLineColor_rgb = yuv2rgb(blockLineColor_yuv);
|
||
|
||
// [5] 与源场景图进行混合
|
||
float4 sceneColor = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoord);
|
||
return lerp(sceneColor, float4(blockLineColor_rgb, blockLineColor.a), _Alpha);
|
||
}
|
||
|
||
|
||
ENDHLSL
|
||
|
||
SubShader
|
||
{
|
||
Cull Off ZWrite Off ZTest Always
|
||
|
||
Pass
|
||
{
|
||
HLSLPROGRAM
|
||
|
||
#pragma vertex VertDefault
|
||
#pragma fragment Frag_Horizontal
|
||
|
||
ENDHLSL
|
||
|
||
}
|
||
|
||
Pass
|
||
{
|
||
HLSLPROGRAM
|
||
|
||
#pragma vertex VertDefault
|
||
#pragma fragment Frag_Vertical
|
||
|
||
ENDHLSL
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
|