73 lines
2.8 KiB
Plaintext
73 lines
2.8 KiB
Plaintext
float pingPong(float x, float lengthValue)
|
|
{
|
|
float safeLength = max(lengthValue, 0.0001);
|
|
float period = safeLength * 2.0;
|
|
float wrapped = x - floor(x / period) * period;
|
|
return wrapped <= safeLength ? wrapped : (period - wrapped);
|
|
}
|
|
|
|
float3 hsvToRgb(float3 hsv)
|
|
{
|
|
float3 p = abs(frac(hsv.x + float3(0.0, 0.6666667, 0.3333333)) * 6.0 - 3.0);
|
|
float3 rgb = saturate(p - 1.0);
|
|
return hsv.z * lerp(float3(1.0, 1.0, 1.0), rgb, hsv.y);
|
|
}
|
|
|
|
float4 shadeVideo(ShaderContext context)
|
|
{
|
|
float2 resolution = max(context.outputResolution, float2(1.0, 1.0));
|
|
float minDimension = min(resolution.x, resolution.y);
|
|
float logoAspect = 2.0;
|
|
|
|
float safeScale = max(logoScale, 0.05);
|
|
float2 logoHalfSize = float2(minDimension * safeScale, minDimension * safeScale / logoAspect);
|
|
float2 paddingPx = float2(minDimension * max(edgePadding, 0.0), minDimension * max(edgePadding, 0.0));
|
|
float2 minCenterPx = logoHalfSize + paddingPx;
|
|
float2 maxCenterPx = resolution - logoHalfSize - paddingPx;
|
|
float2 travelPx = max(maxCenterPx - minCenterPx, float2(1.0, 1.0));
|
|
|
|
float2 velocityPx = float2(
|
|
max(20.0, bounceSpeed * minDimension * 1.00),
|
|
max(24.0, bounceSpeed * minDimension * 0.77));
|
|
float2 motionPx = context.time * velocityPx;
|
|
float2 centerPx = minCenterPx + float2(
|
|
pingPong(motionPx.x, travelPx.x),
|
|
pingPong(motionPx.y, travelPx.y));
|
|
|
|
int xHits = int(floor(motionPx.x / max(travelPx.x, 1.0)));
|
|
int yHits = int(floor(motionPx.y / max(travelPx.y, 1.0)));
|
|
int totalHits = max(0, xHits + yHits);
|
|
|
|
float hue = frac(0.09 + float(totalHits) * 0.173);
|
|
float3 badgeColor = hsvToRgb(float3(hue, 0.86, 1.0));
|
|
float3 glowColor = hsvToRgb(float3(frac(hue + 0.06), 0.72, 1.0));
|
|
|
|
float2 fragPx = context.uv * resolution;
|
|
float2 logoMin = centerPx - logoHalfSize;
|
|
float2 logoSize = logoHalfSize * 2.0;
|
|
float2 logoUv = (fragPx - logoMin) / max(logoSize, float2(1.0, 1.0));
|
|
float insideX = step(0.0, logoUv.x) * step(logoUv.x, 1.0);
|
|
float insideY = step(0.0, logoUv.y) * step(logoUv.y, 1.0);
|
|
float inside = insideX * insideY;
|
|
|
|
float4 logoSample = dvdLogoTexture.Sample(logoUv);
|
|
logoSample *= inside;
|
|
|
|
float logoAlpha = logoSample.a;
|
|
float logoLuma = dot(logoSample.rgb, float3(0.299, 0.587, 0.114));
|
|
float3 tintedLogo = lerp(logoSample.rgb, badgeColor * max(logoLuma, 0.35), 0.88);
|
|
|
|
float2 edgeDistancePx = min(logoUv, 1.0 - logoUv) * logoSize;
|
|
float innerEdgePx = min(edgeDistancePx.x, edgeDistancePx.y);
|
|
float rim = (1.0 - smoothstep(0.0, 5.0, innerEdgePx)) * logoAlpha;
|
|
float glow = (1.0 - smoothstep(0.0, minDimension * 0.06, innerEdgePx + minDimension * 0.025)) * glowAmount * logoAlpha;
|
|
|
|
float3 color = tintedLogo;
|
|
color += glowColor * glow * 0.6;
|
|
color = lerp(color, float3(1.0, 1.0, 1.0), rim * 0.32);
|
|
|
|
float alpha = saturate(max(logoAlpha, glow * 0.5) * baseAlpha);
|
|
float3 premultipliedColor = saturate(color) * alpha;
|
|
return float4(premultipliedColor, alpha);
|
|
}
|