#include "UnityCG.cginc"
#include "noiseSimplex.cginc"
#pragma kernel HeightCompute
//helper functions and structs
struct NoiseSettings
{
int layers;
float3 mainOffset;
float3 mainFrequency;
float frequency;
float amplitude;
float hscale;
};
float LayeredNoise(float3 pos, NoiseSettings settings)
{
float h = 0, a = 1;
pos += settings.mainOffset;
pos *= settings.mainFrequency;
for (int i = 1; i <= settings.layers; i++)
{
h += snoise(pos) * a;
pos *= settings.frequency;
a *= settings.amplitude;
}
return h * settings.hscale;
}
// constants
int size;
float testValue;
CBUFFER_START(noiseSettingsBuffer)
NoiseSettings testNoise;
CBUFFER_END
//buffers
RWStructuredBuffer<float3> vertexPos;
[numthreads(64, 1, 1)]
void HeightCompute(int3 id : SV_DispatchThreadID)
{
//we ditch this tread if its bigger than the buffer
if (id.x > size || id.x > size)return;
float3 pos = vertexPos[id.x];
float h = 0;
h = LayeredNoise(pos, testNoise);
vertexPos[id.x] += normalize(pos) * h;
return;
}