Den här laborationen syftar till att visa att det inte krävs några särskilda program eller något speciellt programspråk för att skapa procedurella bilder. Det fungerar utmärkt med vilket programspråk som helst. Java är ett fungerande alternativ, även om det inte går fullt så fort att beräkna bilder i Java som i vissa andra språk, till exempel C eller C++. Matlab är också riktigt användbart för labben, av flera skäl: ni har redan god vana vid Matlab, det är ett utmärkt verktyg för att skriva prototypkod, och det har färdiga funktioner för att behandla och visa bilder.
Förutom de operationer och elementära funktioner som man kan hitta i de flesta programspråk så är det bra att ha Perlin Noise och cellular noise eller liknande funktioner, eftersom detta slags halvregelbundna mönster är så centrala för ämnet.
Man kan som sagt använda vilket programspråk som helst för att göra den här sortens programmering, men Java, C/C++ eller Matlab är de rekommenderade programspråken för att göra denna laboration på enklaste och mest begripliga sätt, inte minst för att det är för de tre språken som jag bidrar nedan med funktioner för Perlin noise och cellular noise. Motsvarande funktioner finns för flera andra språk, men då får ni leta upp dem själva på nätet.
Cellular noise var skrivet i C från början, och jag portade det till Java på ett litet småfult och långsamt men fungerande sätt. Ken Perlin har skrivit sin moderna variant av Perlin noise samt Perlin simplex noise i Java, men jag har utökat och snabbat upp hans kod ganska väsentligt, och översatt den till C. C-versionerna av Perlin, simplex och cellular noise har jag sedan även packat in i så kallade MEX-filer så att de kan användas av Matlab. MEX-filerna är kompilerade för 64-bitars Windows. Om du kör någon annan plattform får du själv kompilera dem inifrån Matlab med kommandot "mex", men om du har Linux eller MacOS är det en enkel process. Det är bara i Windows som det är krångligt - därav de förkompilerade filerna.
Jag bidrar med programskelett i Java och C som ritar upp en enkel animerad noise-bild. Java-filerna kräver inget utöver en någorlunda modern Java SDK samt de java-filer som finns i arkivet nedan. C-programmet bygger på programbiblioteket GLFW 3 (www.glfw.org) som finns inkluderat för Windows i zip-filen (libglfw3.a). På ITN finns den enkla men smidiga programmeringsmiljön Dev-C++ installerad i alla labsalar. C-kodexemplet innehåller en projektfil för det programmet (.dev). Om du i stället vill använda t ex Code::Blocks eller Visual Studio så får du själv skapa ett projekt med rätt inställningar för att hitta headerfiler och bibliotek. Jag föreslår att du helt enkelt använder Dev-C++ för att slippa strul.
I Matlab får du göra kringarbetet själv om du vill se rörliga bilder - jag gav upp försöken att få till en snabb och flimmerfri animering av bilder i Matlab. (Det går förmodligen, men jag hade inte tid att pilla med det.) Tänk åtminstone igenom hur en tidsberoende animering skulle kunna göras även om du använder Matlab som labmiljö. Att kunna göra mönster som förändras med tiden är en av de stora fördelarna med procedurella bilder.
Om du vill köra på en egen dator så går det bra. Paketen ovan funkar bra på de flesta moderna datorer. Däremot har jag tyvärr inte tid att förbereda filer för andra operativsystem än Windows. Java- och Matlab-versionerna ovan är förstås kompatibla mellan plattformarna, men det lilla extra krångel som du behöver ta dig igenom för att få C-programmet att fungera i MacOS X eller Linux får du hantera på egen hand. Det du behöver göra är att installera biblioteket GLFW 3 och sätta upp en projektfil för att kompilera programmet på rätt sätt i den programmeringsmiljö du väljer. Jag har hyfsat god vana vid både MacOS X och Linux själv och hjälper gärna till i mån av tid, men jag hinner tyvärr inte förbereda detta åt er. MacOS X och Linux ändrar sig tillräckligt mycket varje år för att det inte ska fungera riktigt likadant mellan åren, och jag hinner inte hålla mig uppdaterad om detaljerna.
Din uppgift på laborationen är att skriva ett program som genererar ett rimligt intressant och någorlunda invecklat mönster, helst i färg, och där tidsvariabeln (om du inte använder Matlab) används på ett sätt som ger en rörelse i bilden. Gör vågmönster, celler som växer, något som liknar eld, rök eller moln, något slags slingrande, skimrande, flödande eller på annat sätt rörligt mönster där du använder några olika funktioner för att skapa och blanda ihop procedurella element till en bild. Exakt vad du gör är inte så noga, huvudsaken är att det blir något som rör sig och som du tänkt ut och programmerat själv. Det är inte absolut nödvändigt att du använder en noise-funktion i ditt program, men det är ofta det enklaste sättet att få en rimligt intressant bild med förhållandevis litet arbete.
Observera att du inte ska "rita" saker i bilden på traditionellt sätt. Strukturen på ditt program skall vara en loop där samtliga pixels i utbilden ritas med samma funktion, en "shader" som bara tar pixelns position och aktuell tid som indata. I Matlab kan du räta ut dina loopar genom att göra operationer på hela bilden i stället för på en pixel i taget, men det är inte så viktigt. Det väsentliga är att du ska köra samma kod för samtliga pixels.
Jag finns tillgänglig för att svara på frågor och hjälpa till om du kör fast, men det är dina egna idéer, din nyfikenhet och din uppfinningsrikedom som kommer i första hand. Lek. Testa. Förvirra dig. Ställ frågor. Lär dig.
Kravet för godkänt på laborationen är att du visar upp ett icke-trivialt, helst rörligt mönster som beräknas med din egen programkod, och att du förstår och kan förklara vad du gjort. Muntlig examination på laborationstillfället är att föredra. Om du inte hinner klart inom tiden för labpasset, gör klart på egen tid och visa upp resultatet vid nästa labtillfälle.
Lycka till!