inear

Alla experiment

Skapa, testa och förstå3D, WebGL och spelutveckling

Talk

Perlin noise: så fungerar brus, oktaver och ridged noise

Perlin noise är grunden för berg, moln och marmor i datorgrafik. Här är brusets historia, oktaver, ridged noise och hur du använder det i three.js och GLSL.

Skribent
Publicerad
Uppdaterad
Lästid
7 min
Två spelutvecklare skissar berg och tittar på en genererad bergsterräng

Perlin noise är brusfunktionen bakom otaliga berg, moln och marmorytor i datorgrafik. Ken Perlin utvecklade metoden 1983 och presenterade den i artikeln An Image Synthesizer på SIGGRAPH 1985. Den här guiden förklarar hur bruset fungerar, hur oktaver bygger upp detaljer och hur varianten ridged noise ger skarpa bergskammar i terräng.

Original
Inlägg och Flashdemo om ridged fraktalt brus av Einar Öberg
Algoritmen
Ken Perlin, utvecklad 1983 och publicerad 1985
Teknik
ActionScript 3 i Flash, byggt på en optimerad variant av Perlin noise från Flash-communityn
Status i dag
Demon går inte att köra eftersom Flash Player inte längre stöds

Sidan är en ny guide skriven av redaktionen. Det ursprungliga inlägget och Flashdemon skapades av Einar Öberg och redaktionen har inte byggt någon del av originalet.

Vad innebär Perlin noise?

Vanligt slumpbrus hoppar fritt mellan olika värden och ser ut som myrornas krig på en gammal tv-skärm. Perlin noise är i stället ett mjukt brus där punkter nära varandra får närliggande värden utan att mönstret upprepar sig på något tydligt sätt. Därför passar det för allt i naturen som är oregelbundet men ändå sammanhängande, som berg, moln, eld och trämönster.

Perlin ville få bort det maskinmässiga utseendet i datorbilder. Han hade arbetat med filmen Tron på företaget MAGI innan han utvecklade metoden. År 1997 fick han en Technical Achievement Award av den amerikanska filmakademin för sitt arbete med bruset. Algoritmen patenterades aldrig.

Så här beräknas bruset

Ytan delas in i ett rutnät. Varje hörn i rutnätet har en fast gradientvektor som pekar i en viss riktning. För en punkt inuti en cell beräknas skalärprodukten mellan varje hörns vektor och vektorn från hörnet till punkten. Dessa skalärprodukter vägs sedan samman med en mjuk interpolering, så att kurvan blir jämn även vid gränserna mellan cellerna.

I två dimensioner används fyra hörn medan tre dimensioner kräver åtta. Kostnaden växer med två upphöjt till antalet dimensioner, vilket blir dyrt i fyra dimensioner eller fler. År 2002 publicerade Perlin en förbättrad version med en mjukare övergångsfunktion som han kallade Improved Noise. Den versionen ligger till grund för klassen ImprovedNoise i three.js.

Oktaver och fBm

Ett enskilt lager av Perlin noise ser ut som mjuka kullar. Naturen har detaljer i många skalor samtidigt, från bergskedjor ner till småsten. Lösningen är att lägga ihop flera lager, så kallade oktaver, där varje lager har högre frekvens men lägre styrka än det föregående. Summan av lagren kallas fraktalt brus eller fBm, efter engelskans fractal Brownian motion.

  1. OktaverAntalet lager som läggs ihop. Fler lager ger finare detaljer.
  2. LacunarityAnger hur mycket frekvensen ökar mellan två lager, ofta en fördubbling.
  3. Gain eller persistensAnger hur mycket amplituden minskar för varje lager. Ett lågt värde ger en mjukare terräng.
  4. OffsetAnger i ridged noise den nivå som bruset vänds kring, vanligtvis 1.

När lacunarity är 2 och gain 0,5 fördubblas frekvensen medan styrkan halveras för varje oktav. Fler oktaver ger fler detaljer men kräver också mer beräkningskraft.

Ridged noise: från kullar till bergskammar

Ridged noise utgår från en enkel iakttagelse. Perlin noise pendlar mellan negativa och positiva värden och passerar noll mjukt. Tar man absolutvärdet blir varje nollpassage en skarp dal, ett mönster som ofta kallas turbulens. Därefter vänder man kurvan genom att subtrahera absolutvärdet från 1 så att dalarna omvandlas till vassa åsar.

Perlin noise med tre oktaver, mellan minus 1 och 1Absolutvärdet: nollpassager blir skarpa dalarRidged: (1 minus absolutvärdet) i kvadrat ger åsar
Illustrationen visar samma brus i tre steg och är redaktionens egen, beräknad med en endimensionell gradientbrusfunktion.

Den vanliga formeln för en oktav har fyra steg. Man tar offsetvärdet, oftast 1, minus absolutvärdet av bruset. Resultatet kvadreras så att åsarna blir smalare och skarpare. Till sist multipliceras värdet med en vikt från föregående oktav.

Steg Räkning Effekt
1. Absolutvärde |n| Nollpassager blir skarpa dalar
2. Invertera offset – |n| Dalarna blir åsar
3. Kvadrera s × s Åsarna blir smalare och vassare
4. Vikta s × vikt, där nästa vikt = s × gain, begränsad till 0 till 1 Detaljerna hamnar på åsarna medan dalarna förblir släta

Viktningen är det som skiljer ridged multifractal från vanlig turbulens. Där föregående lager låg högt uppe på en ås får nästa lager större inverkan. Där det låg lågt dämpas detaljerna. Resultatet blir bergskedjor med skrovliga toppar och mjukare dalgångar. Tekniken kommer från F. Kenton Musgrave, vars funktion RidgedMultifractal ligger till grund för motsvarande modul i libnoise-biblioteket.

Originalet: ridged brus i Flash

Det ursprungliga inlägget på den här adressen beskrev en implementation av ridged fraktalt brus i ActionScript 3. Einar Öberg hade letat efter metoder för att bygga en terrängeditor utan att hitta några färdiga exempel i AS3. Därför utgick han från en optimerad variant av Perlin noise som cirkulerade i Flash-communityn, med rötter hos Ron Valstar, Quasimondo och Nicolas Cannasse. Enligt inlägget var det enkelt att lägga till själva ridged-delen.

Mönster av ridged Perlin noise från det ursprungliga inlägget
Bilden kommer från det ursprungliga inlägget.

Demon begränsade bildstorleken till 200 gånger 200 pixlar eftersom större bilder blev för långsamma. Hela Flashfilen var bara 26 kB. Parametrarna offset, gain och persistens kunde ändras direkt i en editor. Beskrivningarna av dem var lånade från referensen till terrängprogrammet World Machine. Målet var höga berg och sanddyner. Nästa tänkta steg var att visa höjdkartan i 3D med hjälp av en voxelmotor.

Höjdkarta med åsar skapad med ridged Perlin noise i det ursprungliga inlägget
Bilden kommer från det ursprungliga inlägget.

Simplex noise och andra varianter

Ken Perlin utvecklade simplex noise år 2001 som en efterträdare. I stället för rutor och kuber delar den upp rummet i simplex, det vill säga trianglar i två dimensioner och tetraedrar i tre. Med färre hörn per cell växer kostnaden ungefär med kvadraten på antalet dimensioner i stället för exponentiellt. Bruset har också färre synliga riktningar. Ett amerikanskt patent på vissa användningar i tre eller fler dimensioner gick ut den 8 januari 2022.

För terräng spelar valet mindre roll än man kan tro. Både Perlin noise och simplex noise fungerar som grund för fBm och ridged noise, eftersom formlerna ovan bara behöver en funktion som ger mjukt brus mellan minus 1 och 1.

Perlin noise i three.js och GLSL i 2026

I three.js finns två färdiga tillägg för brus: SimplexNoise och ImprovedNoise. Det senare bygger på Perlins version från 2002 och används i det officiella terrängexemplet för att lyfta hörnen i ett plan så att det blir ett landskap. Med några rader kod till får du ridged noise i stället för mjuka kullar.

1. Planet

Skapa en PlaneGeometry med många segment och rotera den så att planet ligger horisontellt.

2. Höjden

Gå igenom hörnen och sätt höjden till summan av flera oktaver ridged noise.

3. Normalerna

Anropa computeVertexNormals så att ljuset följer de nya formerna.

4. Ljuset

Använd ett material som reagerar på ljus och låt ett riktat ljus falla in från sidan.

Om du vill beräkna bruset på grafikkortet implementerar du det i en shader. Ett vanligt grepp är att klistra in en färdig implementation av simplex noise i GLSL och bygga fBm och ridged noise ovanpå den. Kapitlet om fraktalt brus i The Book of Shaders visar både turbulens och ridge-funktionen med offset och kvadrering.

I en vertex shader kan bruset flytta hörnen och forma terrängen direkt på grafikkortet. Samma funktion i en fragment shader ger texturer som liknar moln, marmor eller lava.

Lärdomar

Perlin noise visar hur långt en liten funktion räcker. Med några rader kod och ett par parametrar går det att skapa allt från moln till hela bergskedjor. Ridged noise är ett bra exempel på hur små ändringar i formeln, ett absolutvärde och en kvadrat, ger en helt ny karaktär.

Lek med parametrarna innan du skriver mer kod. Ofta räcker det att ändra offset, gain eller antalet oktaver för att gå från sanddyner till alptoppar, något som originalinlägget också lyfte fram. Är begrepp som hörn, normaler och shaders nya för dig kan du börja med den korta introduktionen till 3D och sedan återvända hit.

Vanliga frågor om Perlin noise

Vem uppfann Perlin noise?

Ken Perlin tog fram algoritmen 1983 och publicerade den 1985. Han fick en Technical Achievement Award av den amerikanska filmakademin 1997.

Vad är skillnaden mellan Perlin noise och ridged noise?

Ridged noise är Perlin noise där varje oktav har gjorts om med absolutvärde, invertering och kvadrering. Resultatet blir skarpa åsar i stället för mjuka kullar.

Är simplex noise bättre än Perlin noise?

Simplex noise är snabbare i högre dimensioner och har färre synliga riktningar. För enkel terräng i två dimensioner märks skillnaden sällan.

Hur många oktaver behövs för terräng?

Det beror på hur stor terrängen är och hur nära kameran kommer. Oktaver med detaljer som är mindre än avståndet mellan två hörn syns inte och kan strykas.

Får jag använda Perlin noise fritt?

Ken Perlin patenterade aldrig den ursprungliga algoritmen och den finns i många öppna bibliotek. Ett patent på vissa användningar av simplex noise gick ut i januari 2022.

Källor

Uppgifterna kontrollerades 20 oktober 2026.

Leave a Comment