Da sich die Anbieter von GPU-Treibern normalerweise nicht die Mühe machen, sie noiseX
in GLSL zu implementieren , suche ich nach einem Dienstprogramm mit der Funktion "Grafik-Randomisierung, Schweizer Taschenmesser" , das vorzugsweise für die Verwendung in GPU-Shadern optimiert ist. Ich bevorzuge GLSL, aber Code, den jede Sprache für mich tun kann, ist in Ordnung, wenn ich ihn selbst in GLSL übersetze.
Insbesondere würde ich erwarten:
a) Pseudozufallsfunktionen - N-dimensionale, gleichmäßige Verteilung über [-1,1] oder über [0,1], berechnet aus M-dimensionalem Keim (idealerweise ein beliebiger Wert, aber ich bin damit einverstanden, dass der Keim zurückgehalten wird zum Beispiel 0..1 für eine gleichmäßige Ergebnisverteilung). Etwas wie:
float random (T seed);
vec2 random2 (T seed);
vec3 random3 (T seed);
vec4 random4 (T seed);
// T being either float, vec2, vec3, vec4 - ideally.
b) Kontinuierliches Rauschen wie Perlin-Rauschen - wiederum N-dimensional, + - gleichmäßige Verteilung mit eingeschränktem Wertesatz und gutem Aussehen (einige Optionen zum Konfigurieren des Erscheinungsbilds wie Perlin-Pegel könnten ebenfalls nützlich sein). Ich würde Unterschriften erwarten wie:
float noise (T coord, TT seed);
vec2 noise2 (T coord, TT seed);
// ...
Ich beschäftige mich nicht sehr mit der Theorie der Zufallszahlengenerierung, daher würde ich mich sehr gerne für eine vorgefertigte Lösung entscheiden , aber ich würde auch Antworten wie "Hier ist ein sehr guter, effizienter 1D-Rand ()" begrüßen und mich erklären lassen Sie, wie man einen guten N-dimensionalen Rand () darüber macht ... " .
vec2 co
? ist es die Reichweite? Samen?co.xy
stattco
?Mir fällt ein, dass Sie eine einfache Ganzzahl-Hash-Funktion verwenden und das Ergebnis in die Mantisse eines Floats einfügen könnten. IIRC Die GLSL-Spezifikation garantiert vorzeichenlose 32-Bit-Ganzzahlen und eine IEEE-Binär-32-Float-Darstellung, sodass sie perfekt portierbar sein sollte.
Ich habe es gerade versucht. Die Ergebnisse sind sehr gut: Es sieht bei jeder Eingabe, die ich versucht habe, genau wie statisch aus, überhaupt keine sichtbaren Muster. Im Gegensatz dazu hat das beliebte Sin / Fract-Snippet bei gleichen Eingaben ziemlich ausgeprägte diagonale Linien auf meiner GPU.
Ein Nachteil ist, dass GLSL v3.30 erforderlich ist. Und obwohl es schnell genug zu sein scheint, habe ich seine Leistung nicht empirisch quantifiziert. AMDs Shader Analyzer beansprucht 13,33 Pixel pro Takt für die vec2-Version auf einem HD5870. Kontrast zu 16 Pixel pro Takt für das Sin / Fract-Snippet. Es ist also sicherlich etwas langsamer.
Hier ist meine Implementierung. Ich habe es in verschiedenen Permutationen der Idee belassen, um es einfacher zu machen, eigene Funktionen daraus abzuleiten.
Bildschirmfoto:
Ich habe den Screenshot in einem Bildbearbeitungsprogramm überprüft. Es gibt 256 Farben und der Durchschnittswert beträgt 127, was bedeutet, dass die Verteilung gleichmäßig ist und den erwarteten Bereich abdeckt.
quelle
Nein, nicht seit 2005. Es ist nur so, dass die Leute darauf bestehen, die alte Version herunterzuladen. Die Version auf dem von Ihnen angegebenen Link verwendet nur 8-Bit-2D-Texturen.
Die neue Version von Ian McEwan von Ashima und mir verwendet keine Textur, läuft jedoch auf typischen Desktop-Plattformen mit viel Texturbandbreite mit etwa der halben Geschwindigkeit. Auf mobilen Plattformen ist die texturlose Version möglicherweise schneller, da die Texturierung häufig einen erheblichen Engpass darstellt.
Unser aktiv gepflegtes Quell-Repository ist:
https://github.com/ashima/webgl-noise
Hier finden Sie eine Sammlung der texturlosen und texturverwendenden Versionen von Rauschen (nur mit 2D-Texturen):
http://www.itn.liu.se/~stegu/simplexnoise/GLSL-noise-vs-noise.zip
Wenn Sie spezielle Fragen haben, können Sie mir gerne direkt eine E-Mail senden (meine E-Mail-Adresse finden Sie in den
classicnoise*.glsl
Quellen).quelle
glBindTexture(GL_TEXTURE_1D, *texID);
usw. Es ist nicht klar, was Sie unter "dem von Ihnen angegebenen Link" verstehen, da Sie aus meiner Antwort zitieren Diese Antwort war jedoch nicht mit Ihrer Implementierung verknüpft. Ich werde meine Antwort aktualisieren, um zu verdeutlichen, worauf ich mich beziehe, und um die neuen Informationen wiederzugeben, die Sie gegeben haben. Menschen als "darauf bestehen", die alte Version herunterzuladen, ist eine Verzerrung, die Sie nicht gutschreiben.Goldrauschen
Sehen Sie jetzt Gold Noise in Ihrem Browser!
Diese Funktion hat die Zufallsverteilung gegenüber der aktuellen Funktion in der Antwort von @appas vom 9. September 2017 verbessert:
Die @ appas-Funktion ist ebenfalls unvollständig, da kein Seed bereitgestellt wird (UV ist kein Seed - für jeden Frame gleich) und funktioniert nicht mit Chipsätzen mit geringer Genauigkeit. Gold Noise wird standardmäßig mit geringer Genauigkeit ausgeführt (viel schneller).
quelle
Es gibt auch eine nette Implementierung, die hier von McEwan und @StefanGustavson beschrieben wird und wie Perlin-Rauschen aussieht, aber "kein Setup erfordert, dh keine Texturen oder einheitlichen Arrays. Fügen Sie sie einfach Ihrem Shader-Quellcode hinzu und rufen Sie sie auf, wo immer Sie wollen".
Dies ist sehr praktisch, insbesondere angesichts der Tatsache, dass die frühere Implementierung von Gustavson, mit der @dep verknüpft ist, eine 1D-Textur verwendet, die in GLSL ES (der Shader-Sprache von WebGL) nicht unterstützt wird .
quelle
Verwenden Sie dies:
Verwenden Sie dies nicht:
Die Erklärung finden Sie unter Verbesserungen des kanonischen einzeiligen GLSL rand () für OpenGL ES 2.0
quelle
mod
eine Annäherung an pi ist.Ich habe gerade diese Version von 3D-Rauschen für die GPU gefunden. Angeblich ist sie die schnellste auf dem Markt:
quelle
Eine gerade, gezackte Version von 1d Perlin, im Wesentlichen ein zufälliger lfo-Zickzack.
Ich habe auch 1-2-3-4d Perlin Rauschen auf Shadertoy Besitzer Inigo Quilez Perlin Tutorial Website gefunden, und Voronoi und so weiter, er hat voll schnelle Implementierungen und Codes für sie.
quelle
Hash: Heutzutage ist webGL2.0 vorhanden, sodass in (w) GLSL Ganzzahlen verfügbar sind. -> Für hochwertigen tragbaren Hash (zu ähnlichen Kosten wie hässliche Float-Hashes) können wir jetzt "ernsthafte" Hashing-Techniken verwenden. IQ implementierte einige in https://www.shadertoy.com/view/XlXcW4 (und mehr)
Z.B:
quelle
Unten sehen Sie ein Beispiel, wie Sie der gerenderten Textur weißes Rauschen hinzufügen. Die Lösung besteht darin, zwei Texturen zu verwenden: ursprüngliches und reines weißes Rauschen, wie dieses: weißes Wiki-Rauschen
Das gemeinsam genutzte Fragment enthält den Parameter uNoiseFactor, der bei jedem Rendern durch die Hauptanwendung aktualisiert wird:
quelle
Ich habe eine der Java-Implementierungen von Ken Perlin in GLSL übersetzt und in einigen Projekten auf ShaderToy verwendet.
Unten ist die GLSL-Interpretation, die ich gemacht habe:
Ich habe es aus Anhang B aus Kapitel 2 von Ken Perlins Noise Hardware an dieser Quelle übersetzt:
https://www.csee.umbc.edu/~olano/s2002c36/ch02.pdf
Hier ist ein öffentlicher Schatten, den ich auf Shader Toy gemacht habe und der die Funktion für gepostete Geräusche verwendet:
https://www.shadertoy.com/view/3slXzM
Einige andere gute Quellen, die ich während meiner Recherche zum Thema Lärm gefunden habe, sind:
https://thebookofshaders.com/11/
https://mzucker.github.io/html/perlin-noise-math-faq.html
https://rmarcus.info/blog/2018/03/04/perlin-noise.html
http://flafla2.github.io/2014/08/09/perlinnoise.html
https://mrl.nyu.edu/~perlin/noise/
https://rmarcus.info/blog/assets/perlin/perlin_paper.pdf
https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch05.html
Ich kann das Buch der Shader nur empfehlen, da es nicht nur eine großartige interaktive Erklärung des Rauschens bietet, sondern auch andere Shader-Konzepte.
BEARBEITEN:
Möglicherweise können Sie den übersetzten Code mithilfe einiger der in GLSL verfügbaren hardwarebeschleunigten Funktionen optimieren. Wird diesen Beitrag aktualisieren, wenn ich dies am Ende tue.
quelle