55 lines
1.7 KiB
HLSL
55 lines
1.7 KiB
HLSL
#include "shared/hash-functions.hlsl"
|
|
#include "shared/noise-functions.hlsl"
|
|
#include "shared/point.hlsl"
|
|
#include "shared/quat-functions.hlsl"
|
|
|
|
cbuffer Params : register(b0)
|
|
{
|
|
float Amount;
|
|
float Frequency;
|
|
float Phase;
|
|
float Variation;
|
|
float3 AmountDistribution;
|
|
float RotationLookupDistance;
|
|
float UseCurlNoise;
|
|
}
|
|
|
|
// struct LegacyPoint {
|
|
// float3 Position;
|
|
// float W;
|
|
// };
|
|
|
|
RWStructuredBuffer<LegacyPoint> ResultPoints : u0;
|
|
|
|
[numthreads(64,1,1)]
|
|
void main(uint3 i : SV_DispatchThreadID)
|
|
{
|
|
uint pointCount, stride;
|
|
ResultPoints.GetDimensions(pointCount, stride);
|
|
if(i.x >= pointCount) {
|
|
return;
|
|
}
|
|
|
|
float3 variationOffset = hash31((float)(i.x%1234)/0.123 ) * Variation;
|
|
|
|
float3 pos = ResultPoints[i.x].Position*0.9; // avoid simplex noice glitch at -1,0,0
|
|
float3 noiseLookup = (pos + variationOffset + Phase* float3(1,-1,0) ) * Frequency;
|
|
|
|
float3 noise = UseCurlNoise < 0.5
|
|
? snoiseVec3(noiseLookup) * Amount/100 * AmountDistribution
|
|
: curlNoise(noiseLookup) * Amount/100 * AmountDistribution;
|
|
|
|
float3 n = float3(1, 0.0, 0) * RotationLookupDistance;
|
|
|
|
float3 posNormal = ResultPoints[i.x].Position*0.9; // avoid simplex noice glitch at -1,0,0
|
|
float3 noiseLookupNormal = (posNormal + variationOffset + Phase * float3(0,-1,0) ) * Frequency + n/Frequency;
|
|
float3 noiseNormal = UseCurlNoise < 0.5
|
|
? snoiseVec3(noiseLookup) * Amount/100 * AmountDistribution
|
|
: curlNoise(noiseLookup) * Amount/100 * AmountDistribution;
|
|
float4 rotationFromDisplace = normalize(qFromVectors(normalize(n), normalize(n+ noiseNormal) ) );
|
|
|
|
ResultPoints[i.x].Position += noise ;
|
|
ResultPoints[i.x].Rotation = qMul(rotationFromDisplace , ResultPoints[i.x].Rotation);
|
|
}
|
|
|