Files
2026-07-13 13:13:17 +08:00

235 lines
6.1 KiB
HLSL

cbuffer ParamConstants : register(b0)
{
float4 Background;
float4 Foreground;
float4 Highlight;
float2 Subdivisions;
float2 SplitProbability;
float2 ScrollSpeed;
float2 ScrollProbability;
float2 Padding;
float Contrast;
float Iterations;
float Seed;
float ForegroundRatio;
float HighlightProbability;
float MixOriginal;
float HighlightSeed;
}
cbuffer TimeConstants : register(b1)
{
float globalTime;
float time;
float runTime;
float beatTime;
}
struct vsOutput
{
float4 position : SV_POSITION;
float2 texCoord : TEXCOORD;
};
Texture2D<float4> ImageA : register(t0);
sampler texSampler : register(s0);
#define mod(x, y) (x - y * floor(x / y))
float sdBox( in float2 p, in float2 b )
{
float2 d = abs(p)-b;
return length(
max(d,float2(0,0))) + min(max(d.x,d.y),
0.0);
}
//----------------------------------------------------------------------------------------
// 1 out, 1 in...
float hash11(float p)
{
p = frac(p * .1031);
p *= p + 33.33;
p *= p + p;
return frac(p);
}
//----------------------------------------------------------------------------------------
// 1 out, 2 in...
float hash12(float2 p)
{
float3 p3 = frac(float3(p.xyx) * .1031);
p3 += dot(p3, p3.yzx + 33.33);
return frac((p3.x + p3.y) * p3.z);
}
//----------------------------------------------------------------------------------------
// 1 out, 3 in...
float hash13(float3 p3)
{
p3 = frac(p3 * .1031);
p3 += dot(p3, p3.yzx + 33.33);
return frac((p3.x + p3.y) * p3.z);
}
//----------------------------------------------------------------------------------------
// 2 out, 1 in...
float2 hash21(float p)
{
float3 p3 = frac(float3(p,p,p) * float3(.1031, .1030, .0973));
p3 += dot(p3, p3.yzx + 33.33);
return frac((p3.xx+p3.yz)*p3.zy);
}
//----------------------------------------------------------------------------------------
/// 2 out, 2 in...
float2 hash22(float2 p)
{
float3 p3 = frac(float3(p.xyx) * float3(.1031, .1030, .0973));
p3 += dot(p3, p3.yzx+33.33);
return frac((p3.xx+p3.yz)*p3.zy);
}
//----------------------------------------------------------------------------------------
/// 2 out, 3 in...
float2 hash23(float3 p3)
{
p3 = frac(p3 * float3(.1031, .1030, .0973));
p3 += dot(p3, p3.yzx+33.33);
return frac((p3.xx+p3.yz)*p3.zy);
}
//----------------------------------------------------------------------------------------
// 3 out, 1 in...
float3 hash31(float p)
{
float3 p3 = frac(float3(p,p,p) * float3(.1031, .1030, .0973));
p3 += dot(p3, p3.yzx+33.33);
return frac((p3.xxy+p3.yzz)*p3.zyx);
}
//----------------------------------------------------------------------------------------
/// 3 out, 2 in...
float3 hash32(float2 p)
{
float3 p3 = frac(float3(p.xyx) * float3(.1031, .1030, .0973));
p3 += dot(p3, p3.yxz+33.33);
return frac((p3.xxy+p3.yzz)*p3.zyx);
}
//----------------------------------------------------------------------------------------
/// 3 out, 3 in...
float3 hash33(float3 p3)
{
p3 = frac(p3 * float3(.1031, .1030, .0973));
p3 += dot(p3, p3.yxz+33.33);
return frac((p3.xxy + p3.yxx)*p3.zyx);
}
//----------------------------------------------------------------------------------------
// 4 out, 1 in...
float4 hash41(float p)
{
float4 p4 = frac(float4(p,p,p,p) * float4(.1031, .1030, .0973, .1099));
p4 += dot(p4, p4.wzxy+33.33);
return frac((p4.xxyz+p4.yzzw)*p4.zywx);
}
//----------------------------------------------------------------------------------------
// 4 out, 2 in...
float4 hash42(float2 p)
{
float4 p4 = frac(float4(p.xyxy) * float4(.1031, .1030, .0973, .1099));
p4 += dot(p4, p4.wzxy+33.33);
return frac((p4.xxyz+p4.yzzw)*p4.zywx);
}
//----------------------------------------------------------------------------------------
// 4 out, 3 in...
float4 hash43(float3 p)
{
float4 p4 = frac(float4(p.xyzx) * float4(.1031, .1030, .0973, .1099));
p4 += dot(p4, p4.wzxy+33.33);
return frac((p4.xxyz+p4.yzzw)*p4.zywx);
}
//----------------------------------------------------------------------------------------
// 4 out, 4 in...
float4 hash44(float4 p4)
{
p4 = frac(p4 * float4(.1031, .1030, .0973, .1099));
p4 += dot(p4, p4.wzxy+33.33);
return frac((p4.xxyz+p4.yzzw)*p4.zywx);
}
static float2 P;
float4 subDivideCel(float4 cel, float2 splitProbability)
{
float4 orgCel = cel;
float2 hash = hash22(cel.xy + float2(Seed+0.1, cel.w) - cel.zw);
float2 scrollFactor = hash > ScrollProbability ? 0: hash;
float2 randomShift =(beatTime * ScrollSpeed - orgCel.zw) * scrollFactor; //2
P= frac(P);
P -= randomShift;
if(hash.x > splitProbability.x && hash.y > splitProbability.y )
return cel;
// Subdivide
cel.zw /= float2(
hash.x < splitProbability.x ? Subdivisions.x : 1,
hash.y < splitProbability.y ? Subdivisions.y : 1);
float2 positionInCel= P - cel.xy;
float2 splitAlignedPosition = floor(positionInCel / cel.zw) * cel.zw;
cel.xy += splitAlignedPosition;
return cel;
}
float4 psMain(vsOutput psInput) : SV_TARGET
{
P = psInput.texCoord;
float4 cel = float4(0,0,1,1);
int steps = min( Iterations, 10);
cel = subDivideCel(cel, float2(1,1));
for(int i=1; i < steps; i ++) {
cel = subDivideCel(cel, SplitProbability);
}
float2 pp = P - cel.xy;
float2 posInCel = mod(pp, cel.zw);
//return float4(posInCel*1,0,1);
if(posInCel.x < Padding.x * 0.1 || posInCel.y < Padding.y * 0.1){
return Background;
}
float hashForCel = hash12(cel.xy + float2(Seed+0.1 , cel.w));
float4 originalColor = ImageA.Sample(texSampler, P);
float gray = lerp(
hashForCel,
hashForCel > ForegroundRatio ? 0:1,
Contrast);
float4 color = lerp(Background, lerp(Foreground, originalColor, MixOriginal), gray);
float hashForCelHighlight = hash11(hashForCel+ HighlightSeed);
if(hashForCelHighlight < HighlightProbability) {
color = Highlight;
}
return clamp(color,0,float4(100,100,100,1));
}