Fuente/ Codesnippets | | | | 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:
|
| | | | |
| | 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 X4XProfan 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. |
| | | | |
| | 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>
|
| | | | |
| | Jens-Arne Reumschüssel | | | | XProfan X4XProfan 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 |
| | | | |
| | 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 X4XProfan 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. |
| | | | |
| | 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 X4XProfan 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: [...] |
| | | | |
|
Zum QuelltextThemeninformationenDieses Thema ha 2 subscriber: |