Use Perlin noise for height texture

This commit is contained in:
Richard Zink committed 2026-10-06 17:20:54 +02:00
1 parent c89cca37bf
commit a96d0fb2bc
1 file changed
+47 -6
+47 -6
View File
@@ -41,12 +41,53 @@
} }
function getHeight(x, y) { function getHeight(x, y) {
var h = 0; var n = perlin2D(x * 0.02, y * 0.02, 4);
h += Math.sin(x * 0.03) * 3; return Math.round(n * 5);
h += Math.cos(y * 0.03) * 3; }
h += Math.sin(x * 0.05 + y * 0.03) * 1.5;
h += Math.cos(y * 0.05 - x * 0.03) * 1; function fade(t) {
return Math.round(h); return t * t * t * (t * (t * 6 - 15) + 10);
}
function lerp(a, b, t) {
return a + t * (b - a);
}
function grad2D(hash, x, y) {
var h = hash & 3;
var u = h < 2 ? x : y;
var v = h < 2 ? y : x;
return ((h & 1) ? -u : u) + ((h & 2) ? -2 * v : 2 * v);
}
var perm = [];
for (var i = 0; i < 256; i++) perm[i] = Math.floor(Math.random() * 256);
for (var i = 0; i < 256; i++) perm[i + 256] = perm[i];
function perlin2D(x, y, octaves) {
var total = 0;
var frequency = 1;
var amplitude = 1;
var maxValue = 0;
for (var i = 0; i < octaves; i++) {
var xi = Math.floor(x * frequency) & 255;
var yi = Math.floor(y * frequency) & 255;
var xf = x * frequency - Math.floor(x * frequency);
var yf = y * frequency - Math.floor(y * frequency);
var u = fade(xf);
var v = fade(yf);
var aa = perm[perm[xi] + yi];
var ab = perm[perm[xi] + yi + 1];
var ba = perm[perm[xi + 1] + yi];
var bb = perm[perm[xi + 1] + yi + 1];
var x1 = lerp(grad2D(aa, xf, yf), grad2D(ba, xf - 1, yf), u);
var x2 = lerp(grad2D(ab, xf, yf - 1), grad2D(bb, xf - 1, yf - 1), u);
total += lerp(x1, x2, v) * amplitude;
maxValue += amplitude;
amplitude *= 0.5;
frequency *= 2;
}
return total / maxValue;
} }
function isWater(h) { function isWater(h) {