156 lines
4.7 KiB
GLSL
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
|
|
}
|
|
}
|
|
} |