项目文件夹

文件
2026-07-13 13:13:17 +08:00

154 行
4.1 KiB
HLSL

// #include "shared/hash-functions.hlsl"
#include "shared/point.hlsl"
#include "shared/quat-functions.hlsl"
cbuffer ParamConstants : register(b0)
{
float DisplaceAmount;
float DisplaceOffset;
float Twist;
float Shade;
float2 DisplaceMapOffset;
float SampleRadius;
}
// cbuffer TimeConstants : register(b1)
// {
// float globalTime;
// float time;
// float runTime;
// float beatTime;
// }
cbuffer Resolution : register(b1)
{
float TargetWidth;
float TargetHeight;
}
cbuffer IntParameters : register(b2)
{
int DisplaceMode;
int UseRGSSMultiSampling;
}
struct vsOutput
{
float4 position : SV_POSITION;
float2 texCoord : TEXCOORD;
};
Texture2D<float4> Image : register(t0);
Texture2D<float4> DisplaceMap : register(t1);
sampler texSampler : register(s0);
float IsBetween(float value, float low, float high)
{
return (value >= low && value <= high) ? 1 : 0;
}
static float displaceMapWidth;
static float displaceMapHeight;
float4 DoDisplace(float2 uv)
{
float4 cx1, cx2, cy1, cy2;
cx1 = cx2 = cy2 = cy1 = float4(0, 0, 0, 0);
float radius2 = 2;
float sx = SampleRadius / displaceMapWidth;
float sy = SampleRadius / displaceMapHeight;
// int sampleIndex = 1;
// float padding = 1;
// float paddingSum;
float2 d = 0;
float len = 0;
float2 direction = 0;
if (DisplaceMode < 1.5)
{
if (DisplaceMode < 0.5)
{
float4 cx1 = DisplaceMap.SampleLevel(texSampler, float2(uv.x + sx, uv.y) + DisplaceMapOffset, 0);
float x1 = (cx1.r + cx1.g + cx1.b) / 3;
float4 cx2 = DisplaceMap.SampleLevel(texSampler, float2(uv.x - sx, uv.y) + DisplaceMapOffset, 0);
float x2 = (cx2.r + cx2.g + cx2.b) / 3;
float4 cy1 = DisplaceMap.SampleLevel(texSampler, float2(uv.x, uv.y + sy) + DisplaceMapOffset, 0);
float y1 = (cy1.r + cy1.g + cy1.b) / 3;
float4 cy2 = DisplaceMap.SampleLevel(texSampler, float2(uv.x, uv.y - sy) + DisplaceMapOffset, 0);
float y2 = (cy2.r + cy2.g + cy2.b) / 3;
d += float2((x1 - x2), (y1 - y2));
// paddingSum += padding;
// padding /= 1.5;
}
else
{
float4 rgba = DisplaceMap.SampleLevel(texSampler, uv + DisplaceMapOffset, 0);
d = float2(0.0, (rgba.r + rgba.g + rgba.b) / 3.0) / 10;
}
float a = (d.x == 0 && d.y == 0)
? 0
: (atan2(d.x, d.y) + Twist / 180 * 3.14158);
direction = float2(sin(a), cos(a));
len = length(d) + 0.000001;
}
else
{
float4 rgba = DisplaceMap.SampleLevel(texSampler, uv + DisplaceMapOffset, 0);
d = DisplaceMode < 0.5 ? (rgba.rg - 0.5) * 0.01
: rgba.rg * 0.01;
len = length(d) + 0.000001;
float rRad = Twist / 180 * 3.14158;
float sina = sin(-rRad);
float cosa = cos(-rRad);
d = float2(
cosa * d.x - sina * d.y,
cosa * d.y + sina * d.x);
direction = d / len;
}
float2 p2 = direction * (-DisplaceAmount * len * 10 + DisplaceOffset);
float imgAspect = TargetWidth / TargetHeight;
p2.x /= imgAspect;
float4 c = Image.SampleLevel(texSampler, uv + p2, 0);
c.rgb *= (1 - len * Shade * 100);
return c;
}
float4 psMain(vsOutput psInput) : SV_TARGET
{
DisplaceMap.GetDimensions(displaceMapWidth, displaceMapHeight);
float2 uv = psInput.texCoord;
float4 c = 0;
if (UseRGSSMultiSampling > 0.5)
{
// 4x rotated grid
float4 offsets[2];
offsets[0] = float4(-0.375, 0.125, 0.125, 0.375);
offsets[1] = float4(0.375, -0.125, -0.125, -0.375);
float2 sxy = float2(TargetWidth, TargetHeight);
c = (DoDisplace(uv + offsets[0].xy / sxy) +
DoDisplace(uv + offsets[0].zw / sxy) +
DoDisplace(uv + offsets[1].xy / sxy) +
DoDisplace(uv + offsets[1].zw / sxy)) /
4;
}
else
{
c = DoDisplace(uv);
}
return clamp(c, 0, float4(999, 999, 999, 1));
}