CapersProject/Assets/09.Shaders/Ink.shader
2024-12-19 19:20:44 +09:00

156 lines
4.7 KiB
GLSL

Shader "Unlit/Ink"
{
Properties
{
_MainTex("Sprite Texture", 2D) = "white" {}
_InkColor("Ink Color", Color) = (0.01, 0.01, 0.1, 1.0)
_Speed("Speed", Float) = 0.1175
_ShadeContrast("Shade Contrast", Float) = 0.11
_Resolution("Resolution", Vector) = (1920, 1080, 0, 0)
_CustomTime("Time", Float) = 0
_Position("Position" , Range(0, 1)) = 0.1
_Opacity("Opacity" , Range(0, 1)) = 1.0
}
SubShader
{
Tags { "Queue"="Transparent" "RenderType"="Transparent" }
LOD 100
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off
Cull Off
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _InkColor;
float4 _GreenScreen;
float _Speed;
float _Position;
float _ShadeContrast;
float4 _Resolution;
float _Opacity;
float _CustomTime;
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
float F3 = 0.333333;
float G3 = 0.1666667;
float3 random3(float3 c) {
float j = 4096.0 * sin(dot(c, float3(17.0, 59.4, 15.0)));
float3 r;
r.z = frac(512.0 * j);
j *= .125;
r.x = frac(512.0 * j);
j *= .125;
r.y = frac(512.0 * j);
return r - 0.5;
}
float simplex3d(float3 p) {
float3 s = floor(p + dot(p, float3(F3,F3,F3)));
float3 x = p - s + dot(s, float3(G3,G3,G3));
float3 e = step(float3(0.0,0.0,0.0), x - x.yzx);
float3 i1 = e * (1.0 - e.zxy);
float3 i2 = 1.0 - e.zxy * (1.0 - e);
float3 x1 = x - i1 + G3;
float3 x2 = x - i2 + 2.0 * G3;
float3 x3 = x - 1.0 + 3.0 * G3;
float4 w, d;
w.x = dot(x, x);
w.y = dot(x1, x1);
w.z = dot(x2, x2);
w.w = dot(x3, x3);
w = max(0.6 - w, 0.0);
d.x = dot(random3(s), x);
d.y = dot(random3(s + i1), x1);
d.z = dot(random3(s + i2), x2);
d.w = dot(random3(s + 1.0), x3);
w *= w;
w *= w;
d *= w;
return dot(d, float4(52.0,52.0,52.0,52.0));
}
float fbm(float3 p)
{
float f = 0.0;
float frequency = 1.0;
float amplitude = 0.5;
for (int i = 0; i < 5; i++)
{
f += simplex3d(p * frequency) * amplitude;
amplitude *= 0.5;
frequency *= 2.0 + float(i) / 100.0;
}
return min(f, 1.0);
}
fixed4 frag(v2f i) : SV_Target
{
float2 uv = 1.0 - i.uv;
float mappedFloat = lerp(-4.0, 1.5, _Position);
uv.x = uv.x * 3.5 + mappedFloat;
// float uvx = uv.x;
// uv.x = uv.y;
// uv.y = uvx;
float timeValue = _CustomTime * _Speed; // 시간 값
// 명시적으로 float3 생성
float3 p = float3(uv.x, uv.y, timeValue);
float blot = fbm(p * 2.0 + 4.0) - 0.1;
float shade = fbm(p * 3.0 + 16.0) - 0.2;
blot = (blot + (sqrt(uv.x) - abs(0.5 - uv.y)));
blot = smoothstep(0.0, 0.05, blot) * max(1.0 - shade * _ShadeContrast, 0.0);
_GreenScreen = _InkColor;
float3 color = lerp(_GreenScreen.rgb, _InkColor.rgb, blot);
// 반대 부분을 완전 투명하게 처리
// blot 값을 기준으로 그려지는 부분만 알파를 설정하고 나머지는 완전 투명
float alpha = blot > 0.01 ? 1.0 : 0.0;
alpha *= _Opacity;
return float4(color , alpha);
}
ENDCG
}
}
}