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

140 lines
4.0 KiB
HLSL

// RWTexture2D<float4> outputTexture : register(u0);
Texture2D<float4> inputTexture : register(t0);
sampler texSampler : register(s0);
cbuffer ParamConstants : register(b0)
{
float4 Fill;
float4 Background;
float2 Size;
float2 Offset;
float ScaleFactor;
float Rotate;
float DotSize;
float LineWidth;
float LineRatio;
float RAffects_DotSize;
float GAffects_LineWidth;
float BAffects_LineRatio;
float MixOriginal;
float Feather;
}
// cbuffer TimeConstants : register(b1)
// {
// float globalTime;
// float time;
// float runTime;
// float beatTime;
// }
cbuffer Resolution : register(b1)
{
float TargetWidth;
float TargetHeight;
}
struct vsOutput
{
float4 position : SV_POSITION;
float2 texCoord : TEXCOORD;
};
#define mod(x, y) (x - y * floor(x / y))
float4 psMain(vsOutput psInput) : SV_TARGET
{
float2 uv = psInput.texCoord;
float4 orgColor = inputTexture.SampleLevel(texSampler, uv, 0.0);
// return float4(MixOriginal, 0,0,1);
float aspectRatio = TargetWidth / TargetHeight;
float2 p = uv;
p -= 0.5;
float edgeSmooth = Feather / ScaleFactor;
p.x *= aspectRatio;
// Rotate
float imageRotationRad = (-Rotate - 90) / 180 * 3.141578;
float sina = sin(-imageRotationRad - 3.141578 / 2);
float cosa = cos(-imageRotationRad - 3.141578 / 2);
p = float2(
cosa * p.x - sina * p.y,
cosa * p.y + sina * p.x);
p.x /= aspectRatio;
// Compute raster cells
float2 divisions = float2(TargetWidth / Size.x, TargetHeight / Size.y) / ScaleFactor;
float2 p1 = p + Offset * float2(-1, 1) / divisions;
float2 pInCell = mod(p1, float2(1 / divisions.x, 1 / divisions.y));
float dotSize = DotSize;
float lineWidth = LineWidth;
float lineRatio = LineRatio;
if (RAffects_DotSize > 0 || GAffects_LineWidth > 0 || BAffects_LineRatio > 0)
{
// Rotate position back to image space
float2 gridSize = float2(1 / divisions.x, 1 / divisions.y);
float2 pShifted = p1 - gridSize / 2;
float2 pInCell2 = mod(pShifted, gridSize);
// return float4(pInCell2,0,1);
float2 pCel = p.xy - pInCell2 + gridSize / 2;
float sina2 = sin(-(-imageRotationRad - 3.141578 / 2));
float cosa2 = cos(-(-imageRotationRad - 3.141578 / 2));
pCel.x *= aspectRatio;
pCel = float2(
cosa2 * pCel.x - sina2 * pCel.y,
cosa2 * pCel.y + sina2 * pCel.x);
pCel.x /= aspectRatio;
pCel += 0.5;
float4 imgColorForCel = inputTexture.SampleLevel(texSampler, pCel, 0.0);
// orgColor = imgColorForCel;
dotSize = lerp(dotSize, imgColorForCel.r, RAffects_DotSize);
lineWidth = lerp(lineWidth, imgColorForCel.g, GAffects_LineWidth);
lineRatio = lerp(lineRatio, imgColorForCel.b, BAffects_LineRatio);
// return imgColorForCel;
}
pInCell *= divisions;
float col = 0;
float2 pInCellCentered = abs(pInCell - 0.5) - 0.5;
float distanceToCorner = length(pInCellCentered);
// Draw Dots
col += smoothstep(dotSize + edgeSmooth, dotSize - edgeSmooth, distanceToCorner);
// Draw Lines
float2 distanceToEdge = abs(pInCellCentered);
float line2 = smoothstep(lineWidth / 2 + edgeSmooth, lineWidth / 2 - edgeSmooth, min(distanceToEdge.x, distanceToEdge.y));
line2 *= LineRatio < 0.5
? smoothstep(lineRatio + edgeSmooth, lineRatio - edgeSmooth, distanceToCorner)
: smoothstep(lineRatio - edgeSmooth, lineRatio + edgeSmooth, distanceToCorner + 0.5);
col += line2;
col = saturate(col);
float4 c = lerp(Background, Fill, col);
// col = 1-col;
// return float4(col,col,col,1);
float a = orgColor.a * saturate(MixOriginal) + c.a - orgColor.a * saturate(MixOriginal) * c.a;
float3 rgb = (1.0 - c.a) * clamp(orgColor.rgb, 0, 1) + c.a * c.rgb;
return float4(clamp(rgb, 0, 10000), clamp(a, 0, 1));
// c.rgb = clamp(c.rgb, 0.000001,1000);
// c.a = clamp(c.a,0,1);
// return c;
}