Files
client/Editor/Internal Data/Third Party/Shaders/Layers/PerlinNoise.hlsl
T
2026-07-31 19:29:07 +03:00

63 lines
1.9 KiB
HLSL

// Licensed under the Non-Profit Open Software License version 3.0
// Variables
uint PerlinType;
float PerlinAmplitude;
float PerlinFrequency;
float2 PerlinOffset;
uint PerlinOctaves;
float PerlinOctavesStrength;
// Methods
float StandardPerlinNoise(uint id, float amplitude, float2 offset){
// Calculate vector
float2 pos = IndexToFloatVector(id, HeightMapResolution);
// Calculate x and y position
float x = float(pos.x) / HeightMapResolution;
float y = float(pos.y) / HeightMapResolution;
// Generate noise
return cnoise(float2(x * amplitude + offset.x, y * amplitude + offset.y));
}
float BillowyPerlinNoise(uint id, float amplitude, float2 offset){
float noise = StandardPerlinNoise(id, amplitude, offset);
return abs(noise * 2 - 1);
}
float RigidPerlinNoise(uint id, float amplitude, float2 offset){
return 1 - BillowyPerlinNoise(id, amplitude, offset);;
}
// Kernel
[numthreads(32,1,1)]
void PerlinNoise (uint3 id : SV_DispatchThreadID)
{
if(id.x < HeightMapLength){ // Keep in bounds
float total = 0;
float frequency = PerlinFrequency;
float amplitude = 1;
float maxvalue = 0;
for(uint i = 0; i < PerlinOctaves; i++){
// Types
if(PerlinType == 0){ // Standard
total += StandardPerlinNoise(id.x, frequency, PerlinOffset) * amplitude;
} else if(PerlinType == 1){ // Billowy
total += BillowyPerlinNoise(id.x, frequency, PerlinOffset) * amplitude;
} else if(PerlinType == 2){ // Rigid
total += RigidPerlinNoise(id.x, frequency, PerlinOffset) * amplitude;
}
maxvalue += amplitude;
amplitude *= PerlinOctavesStrength;
frequency *= 2;
}
// Update buffer
HeightBuffer[id.x] = total/maxvalue;
}
}