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

89 lines
2.3 KiB
HLSL

#include "shared/hash-functions.hlsl"
#include "shared/noise-functions.hlsl"
#include "shared/point.hlsl"
#include "shared/quat-functions.hlsl"
#include "shared/pbr.hlsl"
cbuffer Params : register(b0)
{
float Range;
float Offset;
float Scale;
}
StructuredBuffer<PbrVertex> SourceVertices : t0;
StructuredBuffer<LegacyPoint> Points : t1;
RWStructuredBuffer<PbrVertex> ResultVertices : u0;
static float f;
static float3 posA;
static float3 posB;
static float4x4 orientationA;
static float4x4 orientationB;
float3 TransformVector(float3 v) {
float3 v2 = float3(0,v.yz) * Scale + lerp(posA, posB, f);
v2 = lerp(mul( float4(v2 - posA, 1), orientationA).xyz + posA,
mul( float4(v2 - posB, 1), orientationB).xyz + posB,
f);
return v2;
}
float3 TransformDirection(float3 v) {
// float3 v2 = float3(0,v.yz) + lerp(posA, posB, f);
// v2 = lerp(mul( float4(v2 - posA, 0), orientationA).xyz,
// mul( float4(v2 - posB, 0), orientationB).xyz,
// f);
return lerp( mul( float4(v, 0), orientationA).xyz,
mul( float4(v, 0), orientationA).xyz,
f);
}
[numthreads(64,1,1)]
void main(uint3 i : SV_DispatchThreadID)
{
uint vertexIndex = i.x;
uint vertexCount, stride;
SourceVertices.GetDimensions(vertexCount, stride);
if(vertexIndex > vertexCount) {
return;
}
uint pointCount;
Points.GetDimensions(pointCount, stride);
float weight = 1;
float3 offset;
PbrVertex v = SourceVertices[vertexIndex];
float3 posInWorld = v.Position;
float floatIndex = posInWorld.x * (Range) * pointCount * Scale + Offset * pointCount + 0.00001;
uint aIndex = (int)clamp(floatIndex, 0, pointCount-2);
uint bIndex = aIndex + 1;
f = floatIndex - aIndex;
LegacyPoint pointA = Points[aIndex];
LegacyPoint pointB = Points[bIndex];
orientationA = transpose(qToMatrix(pointA.Rotation));
orientationB = transpose(qToMatrix(pointB.Rotation));
posA = pointA.Position;
posB = pointB.Position;
v.Position = TransformVector(v.Position);
v.Normal = normalize(TransformDirection(v.Normal));
v.Tangent = normalize(TransformDirection(v.Tangent));
v.Bitangent = normalize(TransformDirection(v.Bitangent));
ResultVertices[vertexIndex] = v;
}