Español
Fuente/ Codesnippets

Perlin-Noise / Rauschen (Texturen oder Karten para Juegos generieren)

 

Sven
Bader


Dieses Ejemplo producido Gradientrauschen después de Ken Perlin. Yo experimentiere gerade con el Generierung de Welten en el Stil de Minecraft wobei dieser Algorithmus muy hilfreich es.

Se puede Skalierung y Aussehen cualquier Anpassen y mittels "Oktaven", el Überlagerungen des Musters en verschiedenen Auflösungen, fotorealistische Wolken u otros Texturen erzeugen.

Mit el jeweils gleichen Permutationstabelle (hier por "Seed" steuerbar) se uno siempre el gleiche Ergebnis bekommen y kann así cada cualquier weit entfernten Punkt uno Welt bestimmen, sin ihn speichern tener. Mit una abweichenden Seed erhält uno una neues, zufälliges Muster.

Das Programa begrenzt se el Nötigste aber a herumexperimentieren reicht lo.


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

Proc perlinPrepare

    Declarar i&, used&[permutSize&], val&

    WhileLoop 0, permutSize&-1

        i& = &bucle

        Mientras que 1

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

            If (used&[val&] = 0)

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

            EndIf

        EndWhile

    EndWhile

ENDPROC

Proc perlinGenerate

    Parámetros worldsize&, scale!, octaves&, persistence!
    Declarar pixels#,bmi#,size&
    Dim pixels#,worldSize&*worldSize&*24
    'Mapa de bits Encabezamiento, desafortunadamente nötig el unhandliche Ding, obwohl el Infos eigentlich todos como son
    Def &BI_RGB 0
    Def &DIB_RGB_COLORS 0
    Struct BITMAPINFOHEADER = biSize&, biWidth&, biHeight&, biPlanes%, biBitCount%, biCompression&, biSizeImage&, biXPelsPerMeter&, biYPelsPerMeter&, biClrUsed&, biClrImportant&
    Dim bmi#,BITMAPINFOHEADER
    Claro 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)
    Dim pixels#, size&
    Declarar i!, j!, noiseVal!
    Declarar   x!, y!'params
    Declarar total!, frequency!, amplitude!, maxValue!, i&
    Declarar modX&, modY&, A&, B&, AA&, AB&, BA&, BB&, u!, v!,volver!,xt!,yt!
    Declarar g1!,g2!,g3!,g4!,u2!,v2!,h&,i1!,i2!,i3!

    WhileLoop 0, worldsize& - 1

        i! = &bucle

        WhileLoop 0, worldsize& - 1

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

            WhileLoop 0, octaves& - 1

                i& = &bucle
                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! = if(h& < 4, xt!, yt!)
                v2! = if(h& < 4, yt!, xt!)
                g1! = (if((h& & 1) <> 0, -u2!, u2!) + if((h& & 2) <> 0, -2.0 * v2!, 2.0 * v2!))
                'Gradient 2
                h& = (p&[BA&]) & 7
                u2! = if(h& < 4, xt!-1, yt!)
                v2! = if(h& < 4, yt!, xt!-1)
                g2! = (if((h& & 1) <> 0, -u2!, u2!) + if((h& & 2) <> 0, -2.0 * v2!, 2.0 * v2!))
                'Gradient 3
                h& = (p&[AB&]) & 7
                u2! = if(h& < 4, xt!, yt!-1)
                v2! = if(h& < 4, yt!-1, xt!)
                g3! = (if((h& & 1) <> 0, -u2!, u2!) + if((h& & 2) <> 0, -2.0 * v2!, 2.0 * v2!))
                'Gradient 4
                h& = (p&[BB&]) & 7
                u2! = if(h& < 4, xt!-1, yt!-1)
                v2! = if(h& < 4, yt!-1, xt!-1)
                g4! = (if((h& & 1) <> 0, -u2!, u2!) + if((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 en 0-255
            'Sollte no vorkommen, irgendwo es ni kleine Ungenauigkeit
            Case (noiseVal! > 255) : noiseVal! = 255
            Case (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
    Disponer pixels#, bmi#

ENDPROC

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

Sinestar encargado iskey(27)

    WaitInput

    If 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&))
        Conjunto("RandSeed", seed&)
        perlinPrepare()
        time& = &gettickcount
        perlinGenerate(worldsize&, scale!, octaves&, persistence!)
        Conjunto("decimals",0)
        Localizar 36, 1
        Título de la ventana "Perlin-Noise (" +str$(&gettickcount - time&)+"ms)"

    EndIf

EndWhile


Im Einsatz, todavía sin viel tambor herum:


143 kB
Hochgeladen:31.07.2023
Ladeanzahl51
Descargar
369 kB
Hochgeladen:31.07.2023
Ladeanzahl50
Descargar
6 kB
Hochgeladen:31.07.2023
Ladeanzahl49
Descargar
305 kB
Hochgeladen:31.07.2023
Ladeanzahl48
Descargar
748 kB
Hochgeladen:31.07.2023
Ladeanzahl51
Descargar
 
31.07.2023  
 




Jens-Arne
Reumschüssel
Uijeeeh! Pero esto es extremst langsam! Oben hast Usted en Deiner Beispielgrafik para 480 Pixel 313 Millisekunden Erzeugungszeit adecuado. Es. Aber sólo, si al Programa con Profano2Cpp kompiliert. Ansonsten dauert el XProfan-kompiliert con esta Einstellungen en mi bastante flotten Rechner achteinhalb Minuten!! Tal vez könntest Usted el entscheidende Berechnungs-Proc como nPROC (XPSE) o. como fb- oder pbPROC (JRPC3) escribir? Lo ha sí por desgracia, no cada Profano2Cpp, y como kommt uno auch no mehr ran (anders como a XPSE y 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
Was se Yo sagen? Es ya muy optimiert y incluso el "SetPixel" bin Yo losgeworden.

Mit XPSE Yo mich nie beschäftigt, Inline Ensamblador ginge auch, como Yo aber auch no viel Übung. En Interesse kann Yo una DLL lo hacer oder Javascript.

Der Code es en el Principio auch Profano2CPP optimiert, hay brauchte él nämlich auch immerhin 4 Sekunden, a Yo todos Características eliminiert hatte, el produzieren hay bastante viel Overhead. Jetzt es hay rápidamente aber el Lesbarkeit ha algo gelitten.
 
05.08.2023  
 




Sven
Bader
JS, live en el Navegador... algo langweilig sin Button para ändern. Tal vez erweitere Yo irgendwann todavía
<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;
    volver x - Math.floor(x);

}

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

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

    mientras que (true) {

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

        if (!used[val]) {

            p[i] = val;
            p[i + permutSize] = val;
            used[val] = true;
            romper;

        }

    }

}

function fade(t) {

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

}

function lerp(t, a, b) {

    volver 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;
    volver ((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];
    volver 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;

    }

    volver 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 en 0-255
        //if (noiseVal <128) { noiseVal = 128}
        //noiseVal = noiseVal -128;
        let idx = 4 * (i * size + j);
        imgData.data[idx] = noiseVal;// rot
        imgData.data[idx + 1] = noiseVal;// grün
        imgData.data[idx + 2] = noiseVal;// blau
        imgData.data[idx + 3] = 255;//  Alpha-Kanal

    }

}

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

 
05.08.2023  
 




Jens-Arne
Reumschüssel
Ok, el es rápidamente!
 
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-Programación (GLSL) dauert lo nun auch en XProfan sólo todavía 0,001 Sekunden. Como macht uno con el CPU herum, algo en C++ en 4 Cores a verteilen oder müht se con Ensamblador de esta schafft lo una Mittelklasse Grafikkarte alles en 3584 Cores parallel a berechnen.



Descargar

685 kB
Hochgeladen:17.11.2023
Ladeanzahl27
Descargar
184 kB
Bezeichnung:Diesmal mit XProfan compiliert
Hochgeladen:17.11.2023
Ladeanzahl23
Descargar
 
17.11.2023  
 




Jens-Arne
Reumschüssel
Coole Sache!!!

Gibt lo irgendwo una vernünftiges Tutorial, cómo algo como macht? Lo son sí sicher öfter veces Dinge, el uno ggf. mejor en el 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
Yo denke Yo voluntad el veces en un neuen Tema opiniones zusammenfassen. Letztendlich findest du alles en el Descargar meines letzten Posts. El Shader son en el GLSL (OpenGL Shader Language) geschrieben, el Syntax es en el Principio identisch a C. Daten rein bekommt uno encima Texturen oder sogenannte Uniform Variables. Raus kommt entweder el Bild en el Bildschirm oder una Buffer.

Mit sogenannten Compute Shadern Yo bisher todavía no experimentiert aber el trabajo wohl identisch, puede aber auch beliebige Arrays y otro Datentypen otra vez ausgeben.
 
18.11.2023  
 




Jens-Arne
Reumschüssel
Das wäre echt super, si como una pequeña Hilo draus hacer würdest. Yo denke como z.B. a el Drehen großer Bilder, qué sí en Windows-API siempre otra vez una echter Nervkram es, y natürlich auch daran, irgendetwas rápidamente berechnen que se, qué con Grafik a se nichts a tun ha.
 
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
Hier es el Hilo para Thema "Shader", todavía ausbaufähig aber una Anfang: [...] 
 
20.11.2023  
 



Zum Quelltext


Título del Tema, max. 100 Signo.
 

Systemprofile:

Kein Systemprofil creado. [anlegen]

XProfan:

 Contribución  Font  Smilies  ▼ 

Bitte registro en una Contribución a verfassen.
 

Tema opciones

2.205 Views

Untitledvor 0 min.
Sven Bader06.07.2024
Thomas Freier06.01.2024
HofK20.12.2023
Walter12.12.2023
Más...

Themeninformationen

Dieses Thema ha 2 subscriber:

Sven Bader (6x)
Jens-Arne Reumschüssel (4x)


Admins  |  AGB  |  Applications  |  Autores  |  Chat  |  Política de Privacidad  |  Descargar  |  Entrance  |  Ayuda  |  Merchantportal  |  Pie de imprenta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Juegos  |  Búsqueda  |  Support

Ein Projekt aller XProfan, el lo son!


Mi XProfan
Privado Noticias
Eigenes Ablageforum
Temas-Merkliste
Eigene Beiträge
Eigene Temas
Zwischenablage
Cancelar
 Deutsch English Français Español Italia
Traducciones

Política de Privacidad


Wir uso Cookies sólo como Session-Cookies wegen el technischen Notwendigkeit y en uns hay no Cookies de Drittanbietern.

Wenn du hier en unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung de Informationen en unseren Cookies en XProfan.Net a.

Weitere Informationen a unseren Cookies y dazu, como du el Kontrolle darüber behältst, findest du en unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Yo möchte no Cookie