更新
This commit is contained in:
@@ -0,0 +1,213 @@
|
||||
Shader "Soullies/DTM_FramesFloor"
|
||||
{
|
||||
Properties
|
||||
{
|
||||
[HDR]_Color0("Color0", Color) = (1, 1, 1, 0)
|
||||
|
||||
[Header(Pattern Settings)]
|
||||
_PatternSize("Pattern Size (X, Y)", Vector) = (2.0, 2.0, 0, 0)
|
||||
_GridDensity("Grid Density (Quantity Multiplier)", Float) = 1.0
|
||||
|
||||
_TimeAngle("Time Angle (Speed)", Float) = 1.0
|
||||
|
||||
[Header(Edge Settings)]
|
||||
_StepA("Step A", Range(0, 1)) = 0.293
|
||||
_StepB("Step B", Range(0, 1)) = 0.345
|
||||
|
||||
[Header(Outer Enclosing Border)]
|
||||
[Toggle(_OUTER_BORDER_ON)] _EnableOuterBorder("Enable Outer Border", Float) = 0
|
||||
[HDR] _OuterBorderColor("Outer Border Color", Color) = (1, 1, 1, 1)
|
||||
_OuterBorderWidth("Outer Border Width", Range(0.0, 0.5)) = 0.02
|
||||
|
||||
[Header(Render State)]
|
||||
[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend("Src Blend", Float) = 5 // SrcAlpha
|
||||
[Enum(UnityEngine.Rendering.BlendMode)] _DstBlend("Dst Blend", Float) = 10 // OneMinusSrcAlpha
|
||||
[Enum(Off, 0, On, 1)] _ZWrite("Z Write", Float) = 0
|
||||
}
|
||||
|
||||
SubShader
|
||||
{
|
||||
Tags
|
||||
{
|
||||
"RenderPipeline" = "UniversalPipeline"
|
||||
"RenderType" = "Transparent"
|
||||
"Queue" = "Transparent-300"
|
||||
"UniversalMaterialType" = "Unlit"
|
||||
"IgnoreProjector" = "True"
|
||||
}
|
||||
|
||||
Blend [_SrcBlend] [_DstBlend]
|
||||
ZWrite [_ZWrite]
|
||||
Cull Back
|
||||
|
||||
Pass
|
||||
{
|
||||
Name "ForwardOnly"
|
||||
Tags { "LightMode" = "UniversalForwardOnly" }
|
||||
|
||||
HLSLPROGRAM
|
||||
// -------------------------------------
|
||||
// Target Config
|
||||
#pragma target 4.5
|
||||
#pragma prefer_hlslcc gles
|
||||
// DOTS and Instancing
|
||||
#pragma multi_compile_instancing
|
||||
#pragma multi_compile_fog
|
||||
// Feature Flags
|
||||
#pragma shader_feature_local _OUTER_BORDER_ON
|
||||
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
|
||||
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
||||
|
||||
struct Attributes
|
||||
{
|
||||
float4 positionOS : POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
|
||||
struct Varyings
|
||||
{
|
||||
float4 positionCS : SV_POSITION;
|
||||
float3 positionWS : TEXCOORD0;
|
||||
float2 uv : TEXCOORD1;
|
||||
half fogFactor : TEXCOORD2;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
CBUFFER_START(UnityPerMaterial)
|
||||
half4 _Color0;
|
||||
float4 _PatternSize;
|
||||
float _GridDensity;
|
||||
float _TimeAngle;
|
||||
float _StepA;
|
||||
float _StepB;
|
||||
half4 _OuterBorderColor;
|
||||
float _OuterBorderWidth;
|
||||
CBUFFER_END
|
||||
|
||||
// -------------------------------------
|
||||
// Custom Helper Functions
|
||||
float2 VoronoiHash(float2 p)
|
||||
{
|
||||
p = float2(dot(p, float2(127.1, 311.7)), dot(p, float2(269.5, 183.3)));
|
||||
return frac(sin(p) * 43758.5453);
|
||||
}
|
||||
|
||||
// Manhattan-based Voronoi optimized for Mobile URP
|
||||
float VoronoiDistance(float2 v, float t)
|
||||
{
|
||||
float2 n = floor(v);
|
||||
float2 f = frac(v);
|
||||
float minDist = 8.0;
|
||||
|
||||
UNITY_UNROLL
|
||||
for (int j = -1; j <= 1; j++)
|
||||
{
|
||||
UNITY_UNROLL
|
||||
for (int i = -1; i <= 1; i++)
|
||||
{
|
||||
float2 g = float2((float)i, (float)j);
|
||||
float2 o = VoronoiHash(n + g);
|
||||
// Oscillating movement
|
||||
o = sin(t + o * 6.2831853) * 0.5 + 0.5;
|
||||
float2 r = f - g - o;
|
||||
// Manhattan distance for rectangular frames
|
||||
float d = 0.5 * (abs(r.x) + abs(r.y));
|
||||
minDist = min(minDist, d);
|
||||
}
|
||||
}
|
||||
return minDist;
|
||||
}
|
||||
|
||||
// -------------------------------------
|
||||
// Vertex Shader
|
||||
Varyings vert(Attributes input)
|
||||
{
|
||||
Varyings output = (Varyings)0;
|
||||
UNITY_SETUP_INSTANCE_ID(input);
|
||||
UNITY_TRANSFER_INSTANCE_ID(input, output);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
|
||||
|
||||
VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz);
|
||||
output.positionCS = vertexInput.positionCS;
|
||||
output.positionWS = vertexInput.positionWS;
|
||||
output.uv = input.uv;
|
||||
output.fogFactor = ComputeFogFactor(vertexInput.positionCS.z);
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
// -------------------------------------
|
||||
// Fragment Shader
|
||||
half4 frag(Varyings input) : SV_Target
|
||||
{
|
||||
UNITY_SETUP_INSTANCE_ID(input);
|
||||
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
|
||||
|
||||
// ==========================================
|
||||
// 1. inner Grid Pattern Calculation
|
||||
// ==========================================
|
||||
float2 worldUV = input.positionWS.xz;
|
||||
|
||||
// Density Multiplier: Higher density = smaller frames = more quantity
|
||||
float density = max(_GridDensity, 0.0001);
|
||||
float2 sizeDivisor = max(_PatternSize.xy, float2(0.0001, 0.0001)) / density;
|
||||
|
||||
float2 scaledUV = worldUV / sizeDivisor;
|
||||
|
||||
// Rotate 45 degrees
|
||||
float c = 0.707106;
|
||||
float s = 0.707106;
|
||||
float2 rotatedUV = mul(scaledUV, float2x2(c, -s, s, c));
|
||||
|
||||
// Time driven animation
|
||||
float t = _TimeAngle * _TimeParameters.x;
|
||||
|
||||
// Voronoi mathematical noise
|
||||
float v = VoronoiDistance(rotatedUV, t);
|
||||
|
||||
// Anti-aliased border mask computation
|
||||
float fw = fwidth(v);
|
||||
float edge1 = smoothstep(_StepA - fw, _StepA + fw, v);
|
||||
float edge2 = smoothstep(_StepB - fw, _StepB + fw, v);
|
||||
float gridAlphaMask = edge2 - edge1;
|
||||
|
||||
half3 gridColor = _Color0.rgb;
|
||||
half gridAlpha = gridAlphaMask * _Color0.a;
|
||||
|
||||
// ==========================================
|
||||
// 2. Outer Enclosing Border
|
||||
// ==========================================
|
||||
half3 finalColor = gridColor;
|
||||
half finalAlpha = gridAlpha;
|
||||
|
||||
#if defined(_OUTER_BORDER_ON)
|
||||
// Calculate distance to nearest UV edge
|
||||
float2 edgeDist = min(input.uv, 1.0 - input.uv);
|
||||
float closestEdge = min(edgeDist.x, edgeDist.y);
|
||||
|
||||
// Uses fwidth for clean smoothstep transition at the edge
|
||||
float borderfw = fwidth(closestEdge);
|
||||
|
||||
// Creates a solid border with a smooth antialiased inner falloff
|
||||
float borderMask = 1.0 - smoothstep(_OuterBorderWidth - borderfw, _OuterBorderWidth + borderfw, closestEdge);
|
||||
|
||||
// Lerp grid to border
|
||||
finalColor = lerp(gridColor, _OuterBorderColor.rgb, borderMask);
|
||||
finalAlpha = lerp(gridAlpha, _OuterBorderColor.a, borderMask);
|
||||
#endif
|
||||
|
||||
// Apply URP Fog
|
||||
finalColor = MixFog(finalColor, input.fogFactor);
|
||||
|
||||
return half4(finalColor, finalAlpha);
|
||||
}
|
||||
ENDHLSL
|
||||
}
|
||||
}
|
||||
FallBack "Hidden/Universal Render Pipeline/FallbackError"
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 272e7eef87baea8408e583d2670e66dd
|
||||
guid: b491aef5bd88c8b44afc30f6f2074f06
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
@@ -1,21 +0,0 @@
|
||||
Shader "Hidden/Custom/Pixelate"
|
||||
{
|
||||
SubShader
|
||||
{
|
||||
Tags { "RenderPipeline" = "UniversalPipeline" }
|
||||
|
||||
Pass
|
||||
{
|
||||
Name "Pixelate Pass"
|
||||
ZTest Always
|
||||
Cull Off
|
||||
ZWrite Off
|
||||
|
||||
HLSLPROGRAM
|
||||
#pragma vertex PixelatePassVert
|
||||
#pragma fragment PixelatePassFrag
|
||||
#include "PixelatePass.hlsl"
|
||||
ENDHLSL
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,100 +0,0 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering;
|
||||
using UnityEngine.Rendering.Universal;
|
||||
|
||||
public class PixelateFeature : ScriptableRendererFeature
|
||||
{
|
||||
public class PixelatePass : ScriptableRenderPass
|
||||
{
|
||||
private static readonly string ProfilerTag = "PixelateEffect";
|
||||
|
||||
private static readonly int PixelateStrengthXID = Shader.PropertyToID("_PixelateStrengthX");
|
||||
private static readonly int PixelateStrengthYID = Shader.PropertyToID("_PixelateStrengthY");
|
||||
private static readonly int SourceTextureID = Shader.PropertyToID("_SourceTexture");
|
||||
|
||||
public Material pixelateMaterial;
|
||||
public float pixelateX = 64f;
|
||||
public float pixelateY = 64f;
|
||||
|
||||
private RTHandle sourceRT;
|
||||
private RTHandle transientRT;
|
||||
|
||||
public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
|
||||
{
|
||||
sourceRT = renderingData.cameraData.renderer.cameraColorTargetHandle;
|
||||
RenderTextureDescriptor descriptor = renderingData.cameraData.cameraTargetDescriptor;
|
||||
descriptor.depthBufferBits = 0;
|
||||
RenderingUtils.ReAllocateIfNeeded(ref transientRT, descriptor, name: "_PixelateTransientRT");
|
||||
}
|
||||
|
||||
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
|
||||
{
|
||||
if (pixelateMaterial == null) return;
|
||||
|
||||
CommandBuffer cmd = CommandBufferPool.Get(ProfilerTag);
|
||||
|
||||
pixelateMaterial.SetFloat(PixelateStrengthXID, pixelateX);
|
||||
pixelateMaterial.SetFloat(PixelateStrengthYID, pixelateY);
|
||||
|
||||
cmd.SetGlobalTexture(SourceTextureID, sourceRT);
|
||||
cmd.SetRenderTarget(transientRT, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store);
|
||||
cmd.DrawProcedural(Matrix4x4.identity, pixelateMaterial, 0, MeshTopology.Triangles, 3);
|
||||
|
||||
cmd.SetGlobalTexture(SourceTextureID, transientRT);
|
||||
cmd.SetRenderTarget(sourceRT, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store);
|
||||
cmd.DrawProcedural(Matrix4x4.identity, pixelateMaterial, 0, MeshTopology.Triangles, 3);
|
||||
|
||||
context.ExecuteCommandBuffer(cmd);
|
||||
CommandBufferPool.Release(cmd);
|
||||
}
|
||||
|
||||
public void UpdateConfig(float x, float y)
|
||||
{
|
||||
pixelateX = x;
|
||||
pixelateY = y;
|
||||
}
|
||||
}
|
||||
|
||||
[System.Serializable]
|
||||
public class PixelateSettings
|
||||
{
|
||||
[SerializeField] private Shader pixelateShader;
|
||||
private Material pixelateMaterial;
|
||||
public Material PixelateMaterial
|
||||
{
|
||||
get
|
||||
{
|
||||
if (pixelateMaterial == null && pixelateShader != null)
|
||||
{
|
||||
pixelateMaterial = new Material(pixelateShader)
|
||||
{
|
||||
hideFlags = HideFlags.HideAndDontSave
|
||||
};
|
||||
}
|
||||
return pixelateMaterial;
|
||||
}
|
||||
}
|
||||
[Min(2)] public float pixelateStrengthX = 64f;
|
||||
[Min(2)] public float pixelateStrengthY = 64f;
|
||||
public RenderPassEvent passEvent = RenderPassEvent.AfterRenderingTransparents;
|
||||
}
|
||||
|
||||
public PixelateSettings settings = new();
|
||||
public PixelatePass pixelatePass;
|
||||
|
||||
public override void Create()
|
||||
{
|
||||
pixelatePass = new PixelatePass
|
||||
{
|
||||
renderPassEvent = settings.passEvent,
|
||||
pixelateMaterial = settings.PixelateMaterial,
|
||||
pixelateX = settings.pixelateStrengthX,
|
||||
pixelateY = settings.pixelateStrengthY
|
||||
};
|
||||
}
|
||||
|
||||
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
|
||||
{
|
||||
renderer.EnqueuePass(pixelatePass);
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f41bcf9b1f0eb6446907e2c52c9f2d39
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,50 +0,0 @@
|
||||
#ifndef PIXELATE_PASS_INCLUDED
|
||||
#define PIXELATE_PASS_INCLUDED
|
||||
|
||||
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
||||
|
||||
TEXTURE2D(_SourceTexture);
|
||||
SAMPLER(sampler_SourceTexture);
|
||||
float4 _SourceTexture_TexelSize;
|
||||
|
||||
float _PixelateStrengthX;
|
||||
float _PixelateStrengthY;
|
||||
|
||||
struct Varyings
|
||||
{
|
||||
float4 positionCS_SS : SV_POSITION;
|
||||
float2 screenUV : VAR_SCREEN_UV;
|
||||
};
|
||||
|
||||
Varyings PixelatePassVert(uint vertexID : SV_VertexID)
|
||||
{
|
||||
Varyings output;
|
||||
output.positionCS_SS = float4(
|
||||
vertexID <= 1 ? -1.0 : 3.0,
|
||||
vertexID == 1 ? 3.0 : -1.0,
|
||||
0.0, 1.0
|
||||
);
|
||||
output.screenUV = float2(
|
||||
vertexID <= 1 ? 0.0 : 2.0,
|
||||
vertexID == 1 ? 2.0 : 0.0
|
||||
);
|
||||
if (_ProjectionParams.x < 0.0)
|
||||
{
|
||||
output.screenUV.y = 1.0 - output.screenUV.y;
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
half4 PixelatePassFrag(Varyings input) : SV_Target
|
||||
{
|
||||
float2 screenUV = input.screenUV;
|
||||
float2 strength = float2(_PixelateStrengthX, _PixelateStrengthY);
|
||||
float2 uvScaled = screenUV * strength;
|
||||
float2 uvFloor = floor(uvScaled);
|
||||
float2 uvCenter = uvFloor + 0.5;
|
||||
float2 uvPixelated = uvCenter / strength;
|
||||
|
||||
return SAMPLE_TEXTURE2D(_SourceTexture, sampler_SourceTexture, uvPixelated);
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8be62d4e6aca4494caf6095e90160cd9
|
||||
ShaderIncludeImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,9 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fb9c9eda58078b14688aa3ca7e93eb3b
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
nonModifiableTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user