Français
Source/ Codesnippets

Perlin-Noise / Rauschen (Texturen ou bien Karten pour Jeux generieren)

 

Sven
Bader


cet Beispiel erzeugt Gradientrauschen pour Ken Perlin. je experimentiere justement avec qui Generierung de Welten im Stil de Minecraft wobei cette Algorithmus très hilfreich ist.

il peut Skalierung et air beliebig Anpassen et mittels "Oktaven", qui Überlagerungen des Musters dans verschiedenen Auflösungen, fotorealistische Wolken ou bien autre Texturen erzeugen.

avec qui jeweils gleichen Permutationstabelle (ici per "Seed" steuerbar) wird on toujours cela gleiche Ergebnis bekommen et peux so jeden beliebig large entfernten Punkt einer monde bestimmen, sans ihn Sauver trop doit. avec einem abweichenden Seed erhält on un nouveau, zufälliges Muster.

cela Programme begrenzt sich sur cela Nötigste mais trop herumexperimentieren reicht es.


Def GetBitmapBits(3) !"gdi32","GetBitmapBits"
Def SetDIBitsToDevice(12) !"gdi32","SetDIBitsToDevice"

Proc perlinPrepare

    Déclarer i&, used&[permutSize&], val&

    WhileLoop 0, permutSize&-1

        i& = &loop

        Tandis que 1

            val& = int((Tour(10001) * 0.0001) * permutSize&)

            Si (used&[val&] = 0)

                p&[i&] = val&
                p&[i& + permutSize&] = val&
                used&[val&] = 1
                Pause

            EndIf

        Endwhile

    Endwhile

ENDPROC

Proc perlinGenerate

    Paramètres worldsize&, scale!, octaves&, persistence!
    Déclarer pixels#,bmi#,size&
    Faible pixels#,worldSize&*worldSize&*24
    'Bitmap En-tête, malheureusement nötig cela unhandliche Ding, quoique qui Infos eigentlich alle voilà
    Def &BI_RGB 0
    Def &DIB_RGB_COLORS 0
    Struct BITMAPINFOHEADER = biSize&, biWidth&, biHeight&, biPlanes%, biBitCount%, biCompression&, biSizeImage&, biXPelsPerMeter&, biYPelsPerMeter&, biClrUsed&, biClrImportant&
    Faible bmi#,BITMAPINFOHEADER
    Claire bmi#

    With bmi#

        .biSize&        = sizeof(bmi#)
        .biWidth&       = worldSize&
        .biHeight&      = worldSize&
        .biPlanes%      = 1
        .biBitCount%    = 32
        .biCompression& = &BI_RGB
        .biSizeImage&   = 0

    EndWith

    size& = worldsize& * worldsize& * (bmi#.biBitCount% / 8)
    Faible pixels#, size&
    Déclarer i!, j!, noiseVal!
    Déclarer   x!, y!'params
    Déclarer total!, frequency!, amplitude!, maxValue!, i&
    Déclarer modX&, modY&, A&, B&, AA&, AB&, BA&, BB&, u!, v!,return!,xt!,yt!
    Déclarer g1!,g2!,g3!,g4!,u2!,v2!,h&,i1!,i2!,i3!

    WhileLoop 0, worldsize& - 1

        i! = &loop

        WhileLoop 0, worldsize& - 1

            j! = &loop
            x! = i! * scale!
            y! = j! * scale!
            total! = 0
            frequency! = 2
            amplitude! = 1
            maxValue! = 0

            WhileLoop 0, octaves& - 1

                i& = &loop
                xt! = x! * frequency!
                yt! = y! * frequency!
                modX& = int(xt!) & (permutSize& - 1)
                modY& = int(yt!) & (permutSize& - 1)
                xt! = xt! - int(xt!)
                yt! = yt! - int(yt!)
                u! = xt! * xt! * xt! * (xt! * (xt! * 6.0 - 15.0) + 10.0)
                v! = yt! * yt! * yt! * (yt! * (yt! * 6.0 - 15.0) + 10.0)
                A&  = p&[modX&]+modY&
                AA& = p&[A&]
                AB& = p&[A&+1]
                B&  = p&[modX&+1]+modY&
                BA& = p&[B&]
                BB& = p&[B&+1]
                'Gradient 1
                h& = (p&[AA&]) & 7
                u2! = si(h& < 4, xt!, yt!)
                v2! = si(h& < 4, yt!, xt!)
                g1! = (si((h& & 1) <> 0, -u2!, u2!) + si((h& & 2) <> 0, -2.0 * v2!, 2.0 * v2!))
                'Gradient 2
                h& = (p&[BA&]) & 7
                u2! = si(h& < 4, xt!-1, yt!)
                v2! = si(h& < 4, yt!, xt!-1)
                g2! = (si((h& & 1) <> 0, -u2!, u2!) + si((h& & 2) <> 0, -2.0 * v2!, 2.0 * v2!))
                'Gradient 3
                h& = (p&[AB&]) & 7
                u2! = si(h& < 4, xt!, yt!-1)
                v2! = si(h& < 4, yt!-1, xt!)
                g3! = (si((h& & 1) <> 0, -u2!, u2!) + si((h& & 2) <> 0, -2.0 * v2!, 2.0 * v2!))
                'Gradient 4
                h& = (p&[BB&]) & 7
                u2! = si(h& < 4, xt!-1, yt!-1)
                v2! = si(h& < 4, yt!-1, xt!-1)
                g4! = (si((h& & 1) <> 0, -u2!, u2!) + si((h& & 2) <> 0, -2.0 * v2!, 2.0 * v2!))
                'Interpolate
                i1! = g3! + u! * (g4! - g3!)
                i2! = g1! + u! * (g2! - g1!)
                i3! = i2! + v! * (i1! - i2!)
                total! = total! + i3! * amplitude!
                maxValue! = maxValue! + amplitude!
                amplitude! = amplitude! * persistence!
                frequency! = frequency! * 2

            Endwhile

            noiseVal! = total! / maxValue!
            noiseVal! = (noiseVal! + 1) / 2.0 * 255.0' Normalisieren sur 0-255
            'Sollte pas vorkommen, irgendwo ist encore une kleine Ungenauigkeit
            Cas (noiseVal! > 255) : noiseVal! = 255
            Cas (noiseVal! < 0) : noiseVal! = 0
            Byte pixels#,4*(int(j!) * worldSize& + int(i!)) + 2  = noiseVal!'R
            Byte pixels#,4*(int(j!) * worldSize& + int(i!)) + 1  = noiseVal!'G
            Byte pixels#,4*(int(j!) * worldSize& + int(i!))      = noiseVal!'B

        Endwhile

        SetDIBitsToDevice(%hdc, 0, 0,worldsize&, worldsize&, 0, 0, 0,  worldsize&,pixels#, bmi#, &DIB_RGB_COLORS)'DIB_RGB_COLORS = 0

    Endwhile

    SetDIBitsToDevice(%hdc, 0, 0,worldsize&, worldsize&, 0, 0, 0,  worldsize&,pixels#, bmi#, &DIB_RGB_COLORS)'DIB_RGB_COLORS = 0
    Dispose pixels#, bmi#

ENDPROC

Déclarer permutSize&, time&
permutSize& = 256
Déclarer p&[permutSize& * 2]
Fenêtre Style 27
Titre de la fenêtre "Perlin-Noise"
Fenêtre 0,0 - 720, 560;0
Cls RGB(236,236,236)
Déclarer edit_worldsize&,  edit_scale&, edit_octaves&, edit_persistence&, edit_seed&, button&
Déclarer worldsize&, scale!, octaves&, persistence!, seed&
Créer("Text",%hwnd,"Größe (px)",500,10,200,20)
Créer("Text",%hwnd,"Skalierung",500,70,200,20)
Créer("Text",%hwnd,"Oktaven",500,130,200,20)
Créer("Text",%hwnd,"Persistence",500,190,200,20)
Créer("Text",%hwnd,"Seed",500,250,200,20)
edit_worldsize&   = Créer("Edit", %hWnd, "128", 500, 30, 200, 24)
edit_scale&       = Créer("Edit", %hWnd, "0.02", 500, 90, 200, 24)
edit_octaves&     = Créer("Edit", %hWnd, "4", 500, 150, 200, 24)
edit_persistence& = Créer("Edit", %hWnd, "0.5", 500, 210, 200, 24)
edit_seed& = Créer("Edit", %hWnd, "12345", 500, 270, 200, 24)
button& = Créer("Button", %hWnd, "Welt erstellen", 500, 330, 200, 24)

WhileNot iskey(27)

    WaitInput

    Si Clicked(button&)

        Cls RGB(236,236,236)
        worldsize&   = val(gettext$(edit_worldsize&))
        scale!       = val(gettext$(edit_scale&))
        octaves&     = val(gettext$(edit_octaves&))
        persistence! = val(gettext$(edit_persistence&))
        seed&        = val(gettext$(edit_seed&))
        Set("RandSeed", seed&)
        perlinPrepare()
        time& = &gettickcount
        perlinGenerate(worldsize&, scale!, octaves&, persistence!)
        Set("decimals",0)
        Localiser 36, 1
        Titre de la fenêtre "Perlin-Noise (" +str$(&gettickcount - time&)+"ms)"

    EndIf

Endwhile


Im Einsatz, encore sans viel tambour herum:


143 kB
Hochgeladen:31.07.2023
Downloadcounter52
Download
369 kB
Hochgeladen:31.07.2023
Downloadcounter50
Download
6 kB
Hochgeladen:31.07.2023
Downloadcounter50
Download
305 kB
Hochgeladen:31.07.2023
Downloadcounter48
Download
748 kB
Hochgeladen:31.07.2023
Downloadcounter52
Download
 
31.07.2023  
 




Jens-Arne
Reumschüssel
Uijeeeh! c'est mais extremst lente! dessus la hâte Du dans Deiner Beispielgrafik pour 480 Pixel 313 Millisekunden Erzeugungszeit angezeigt. cela allez. mais seulement, si on cela Programme avec Profan2Cpp kompiliert. Ansonsten dauert cela XProfan-kompiliert avec cette Einstellungen sur meinem droite flotten calculateur achteinhalb Minuten!! peut-être könntest Du qui entscheidende Berechnungs-Proc comme nPROC (XPSE) bzw. comme fb- ou bien pbPROC (JRPC3) écrivons? Es hat oui malheureusement pas chacun Profan2Cpp, et là venez on aussi pas plus ran (anders comme à XPSE et JRPC3).

Beste Grüße, Jens-Arne
 
XProfan X4
XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM
PM: jreumsc@web.de
04.08.2023  
 




Sven
Bader
quoi soll je dire? c'est déjà très optimiert et sogar cela "SetPixel" suis je losgeworden.

avec XPSE habe je mich nie beschäftigt, Inline Assembler ginge aussi, là habe je mais aussi pas viel Übung. chez intérêt peux je une DLL daraus faire ou bien Javascript.

qui Code ist im Prinzip aussi Profan2CPP optimiert, là brauchte il nämlich aussi immerhin 4 Sekunden, jusqu'à je alle Funktionen eliminiert hatte, qui produzieren là droite viel Overhead. maintenant ist es là vite mais qui Lesbarkeit hat quelque chose gelitten.
 
05.08.2023  
 




Sven
Bader
JS, live im Browser... quelque chose fastidieux sans Button zum changement. peut-être erweitere je es irgendwann encore
<canvas id="myCanvas" width="480" height="480" style="border:1px solid #d3d3d3;"></canvas>
<script>
let worldsize = 480;
let permutSize = 256;
let canvas = document.getElementById('myCanvas');
let ctx = canvas.getContext('2d');
let imgData = ctx.createImageData(worldsize, worldsize);

function seedRandom(seed) {

    let x = Math.sin(seed) * 10000;
    return x - Math.floor(x);

}

let seed = 1;//  Seed
let p = new Uint8Array(permutSize*2);
let used = new Array(permutSize).fill(faux);

for (let i = 0; i < permutSize; ++i) {

    tandis que (vrai) {

        let val = Math.floor(seedRandom(seed) * permutSize);
        seed++;

        si (!used[val]) {

            p[i] = val;
            p[i + permutSize] = val;
            used[val] = vrai;
            pause;

        }

    }

}

function fade(t) {

    return t * t * t * (t * (t * 6 - 15) + 10);

}

function lerp(t, a, b) {

    return a + t * (b - a);

}

function grad(hash, x, y) {

    let h = hash & 7;
    let u = h<4 ? x : y;
    let v = h<4 ? y : x;
    return ((h&1) !== 0 ? -u : u) + ((h&2) !== 0 ? -2.0*v : 2.0*v);

}

function noise(x, y) {

    let X = Math.floor(x) & (permutSize - 1),
    Y = Math.floor(y) & (permutSize - 1);
    x -= Math.floor(x);
    y -= Math.floor(y);
    let u = fade(x),
    v = fade(y);
    let A = p[X  ]+Y, AA = p[A], AB = p[A+1],
    B = p[X+1]+Y, BA = p[B], BB = p[B+1];
    return lerp(v, lerp(u, grad(p[AA  ], x  , y   ),
    grad(p[BA  ], x-1, y   )),
    lerp(u, grad(p[AB  ], x  , y-1 ),
    grad(p[BB  ], x-1, y-1 )));

}

function fractalNoise(x, y, octaves = 6, persistence = 0.02) {

    let total = 0;
    let frequency = 2;
    let amplitude = 100;
    let maxValue = 0;

    for(let i = 0; i < octaves; i++) {

        total += noise(x * frequency, y * frequency) * amplitude;
        maxValue += amplitude;
        amplitude *= persistence;
        frequency *= 2;

    }

    return total/maxValue;

}

let size = worldsize;
let scale = 0.02;

for (let i = 0; i < size; i++) {

    for (let j = 0; j < size; j++) {

        let noiseVal = fractalNoise(i * scale, j * scale,6,0.7);
        noiseVal = (noiseVal + 1) / 2 * 255;// Normalisieren sur 0-255
        //si (noiseVal <128) { noiseVal = 128}
        //noiseVal = noiseVal -128;
        let idx = 4 * (i * size + j);
        imgData.data[idx] = noiseVal;// rouge
        imgData.data[idx + 1] = noiseVal;// vert
        imgData.data[idx + 2] = noiseVal;// bleu
        imgData.data[idx + 3] = 255;//  Alpha-canal

    }

}

ctx.putImageData(imgData, 0, 0);
</script>

 
05.08.2023  
 




Jens-Arne
Reumschüssel
Ok, cela ist vite!
 
XProfan X4
XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM
PM: jreumsc@web.de
09.08.2023  
 




Sven
Bader
So, dank GPU-Shader-Programmation (GLSL) dauert es eh bien aussi dans XProfan seulement encore 0,001 Sekunden. là pouvoir on avec qui CPU herum, quelque chose dans C++ sur 4 Cores trop verteilen ou bien müht sich avec Assembler ab dabei schafft es une Mittelklasse Grafikkarte alles sur 3584 Cores parallèle trop berechnen.



Herunterladen

685 kB
Hochgeladen:17.11.2023
Downloadcounter28
Herunterladen
184 kB
Bezeichnung:Diesmal mit XProfan compiliert
Hochgeladen:17.11.2023
Downloadcounter24
Herunterladen
 
17.11.2023  
 




Jens-Arne
Reumschüssel
Coole l'affaire!!!

Gibt es irgendwo un vernünftiges Tutorial, comment on quelque chose comme pouvoir? il y a oui sûrement öfter la fois Dinge, qui on ggf. besser sur qui GPU ausführt.

Beste Grüße, Jens-Arne
 
XProfan X4
XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM
PM: jreumsc@web.de
17.11.2023  
 




Sven
Bader
je denke je werde cela la fois dans einem neuen vues Thread zusammenfassen. Letztendlich findest du alles im Télécharger meines letzten Posts. qui Shader sommes dans qui GLSL (OpenGL Shader Language) geschrieben, qui Syntax ist im Prinzip identique trop C. données rein bekommt on sur Texturen ou bien sogenannte Uniform Variablen. Raus venez entweder cela Bild sur den Bildschirm ou bien une Buffer.

avec sogenannten Compute Shadern habe je bisher encore pas experimentiert mais qui marcher wohl identique, peut mais aussi beliebige Arrays et autre Datentypen wieder ausgeben.
 
18.11.2023  
 




Jens-Arne
Reumschüssel
cela wäre vraie super, si Du là une kleinen Fil draus faire würdest. je denke là z.B. à cela Drehen großer Bilder, quoi oui sur qui Windows-API toujours wieder un echter Nervkram ist, et naturellement aussi daran, irgendetwas vite berechnen trop laisser, quoi avec Grafik à sich rien trop 1faire hat.
 
XProfan X4
XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM
PM: jreumsc@web.de
19.11.2023  
 




Sven
Bader
ici ist qui Fil zum Thema "Shader", encore ausbaufähig mais un Anfang: [...] 
 
20.11.2023  
 



Zum Quelltext


Topictitle, max. 100 marque.
 

Systemprofile:

ne...aucune Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

s'il te plaît s'inscrire um une Beitrag trop verfassen.
 

Options du sujet

2.439 Views

Untitledvor 0 min.
Sven Bader06.07.2024
Thomas Freier06.01.2024
HofK20.12.2023
Walter12.12.2023
plus...

Themeninformationen



Admins  |  AGB  |  Applications  |  Auteurs  |  Chat  |  protection des données  |  Télécharger  |  Entrance  |  Aider  |  Merchantportal  |  Empreinte  |  Mart  |  Interfaces  |  SDK  |  Services  |  Jeux  |  cherche  |  Support

un projet aller XProfaner, qui il y a!


Mon XProfan
Privé Nouvelles
Eigenes Ablageforum
Sujets-La liste de voeux
Eigene Posts
Eigene Sujets
Zwischenablage
Annuler
 Deutsch English Français Español Italia
Traductions

protection des données


Wir verwenden Cookies seulement comme Session-Cookies à cause de qui technischen Notwendigkeit et chez uns gibt es aucun Cookies de Drittanbietern.

si du ici sur unsere Webseite klickst ou bien navigierst, stimmst du unserer Erfassung de Informationen dans unseren Cookies sur XProfan.Net trop.

Weitere Informationen trop unseren Cookies et en supplément, comment du qui Kontrolle par-dessus behältst, findest du dans unserer nachfolgenden Datenschutzerklärung.


d'accordDatenschutzerklärung
je voudrais keinen Cookie