63 lines
1.9 KiB
HLSL
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;
|
|
}
|
|
}
|