Registriert: Mo Sep 02, 2002 15:41 Beiträge: 867 Wohnort: nahe Stuttgart
Hey,
ich wollte - nach einigen langen eigenen Erlebnissen - nur mal anmerken, dass in das soweit fachlich kompetente, ausführliche und korrekte glsl-Tutorial in den Abschnitt
Zitat:
Noisefunktionen
Sowohl im Vertex als auch im Fragment Shader lassen sich Noisefunktionen nutzen, mit deren Hilfe sich einge Gewisse "Zufälligkeit" simulieren lässt (wirklich zufällige Werte sind es natürlich nicht). Ein zurückgegebener Wert liegt dabei immer im Bereich [-1..1] und ist immer bei gleichem Eigabewert auch immer gleich.
ein ganz dicker fetter Warnhinweis gehört, im Sinne von "Ist (zumindest für OpenGL 2.0) von ATI nicht in Hardware implementiert und nVidia hatte die geniale Idee, sie zwar zu implementieren, aber nur 0.0 zurückgeben zu lassen (= keine Fehlermeldung)."
Nun die Spezifikation schreibt auch noch etwas von einer gausverteilung vor, jedoch, wurde diese abschnitt anscheinen von niemnaden gelesen...Hier ist eine implementation die fast krrekte noise liefert (die texture müsste gegebenfalls angepasst werden)
http://lumina.sourceforge.net/Tutorials/Noise.html
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
keine der noise Funktionen liefert einen Wert zurück. Habe mir nicht weiter gedanken drumgemacht und eine Textur benutzt. ICh werd nachher mal ins Orange Book schauen...
_________________ Es werde Licht. glEnable(GL_LIGHTING); Und es ward Licht.
Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"
Registriert: Mo Sep 02, 2002 15:41 Beiträge: 867 Wohnort: nahe Stuttgart
Meine Recherche ergab das:
GLSL Specs 1.20.8 hat geschrieben:
Noise Functions Noise functions are available to both fragment and vertex shaders. They are stochastic functions that can be used to increase visual complexity. Values returned by the following noise functions give the appearance of randomness, but are not truly random. The noise functions below are defined to have the following characteristics: • The return value(s) are always in the range [-1.0,1.0], and cover at least the range [-0.6, 0.6], with a Gaussian-like distribution. • The return value(s) have an overall average of 0.0 • They are repeatable, in that a particular input value will always produce the same return value • They are statistically invariant under rotation (i.e., no matter how the domain is rotated, it has the same statistical character) • They have a statistical invariance under translation (i.e., no matter how the domain is translated, it has the same statistical character) • They typically give different results under translation. • The spatial frequency is narrowly concentrated, centered somewhere between 0.5 to 1.0. • They are C1 continuous everywhere (i.e., the first derivative is continuous) [...]
6.1.1. Noise Functions Always Return Zero The GLSL standard library contains several noise functions of differing dimensions: noise1, noise2, noise3, and noise4. NVIDIA’s implementation of these functions (currently) always returns zero results.
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
die einzigen Karten/Treiber, die es unterstützen, scheinen wohl die von 3dlabs zu sein. zumindest legen die landschaftsdemos aus dem Orangebook das nahe. Da wird daraufhingewiesen, dass die nur mit 3dlabs karten laufen.
_________________ Es werde Licht. glEnable(GL_LIGHTING); Und es ward Licht.
Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2621 Wohnort: Berlin
Programmiersprache: Go, C/C++
Du solltest mal gucken, ob ein Texturlookup oder folgendes schneller ist.
int n=x+y*789221+seed;
n=(n<<13)^n;
return (1.0f-(float)((n*(n*n*15731+789221)+1376312589) & 0x7fffffff)/1073741824.0f);
Je nachdem würde ich dann eine von beiden Möglichkeiten verwenden.
Crysis nutzt z.B. Texturlookups auf eine Noisetextur für SSAO.
Also denke ich mal, werden Texturlookups auf den neueren Karten schneller sein.
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7804 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
@Whitehunter: Kannst du deine Erkenntnisse ins Wiki stellen? Du hast es recherchiert und kennst dich damit besser aus als z.B. ich. Die anderen GLSLer werden dann bestimmt nochmal drüber lesen.
Erstell am besten einen Artikel mit dem Namen GLSL_Noise_Function. Den bitte auch an der Stelle verlinken die oben genannt wurde. Und auch im Abshcnitt "Hintergrundwissen" direkt unter Perlin Noise.
Falls du rausfinden kannst was die einzelnen Noise-Funktionen eigentlich machen sollten (also wie sie sich unterscheiden) dann unbedingt mit reinschreiben. Vielleicht kommts ja irgendwann doch nochmal.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Ganz wichtig ist es zwischen noise und random zu unterscheiden. Zufalszahlen lassen sich noch einigermaßen schnell erzeugen. Noise dagegen ist ein in der bandbreite beschränktes rauschen, welches auf keinen fall aliasing enthalten darf. (also keine signalanteile über der halben sampling rate) Und diese bedingung kann man nur erfüllen, indem man einen linearen oder höheren filter baut, so das die noise funktion problemlos 50 bis 100 instructions verbraucht. EInetextur ist dann auf jeden fall schneller
Registriert: Mo Sep 02, 2002 15:41 Beiträge: 867 Wohnort: nahe Stuttgart
Flash hat geschrieben:
Erstell am besten einen Artikel mit dem Namen GLSL_Noise_Function. Den bitte auch an der Stelle verlinken die oben genannt wurde. Und auch im Abshcnitt "Hintergrundwissen" direkt unter Perlin Noise.
Ich habe mal GLSL_noise angelegt und versucht, alles was gesagt wurde zusammenzufassen. In Tutorial_glsl#Noisefunktionen hab ich eine Verlinkung hinterlassen; in Hintergrundwissen hab ich direkt kein Perlin Noise gefunden.
Zitat:
Falls du rausfinden kannst was die einzelnen Noise-Funktionen eigentlich machen sollten (also wie sie sich unterscheiden) dann unbedingt mit reinschreiben. Vielleicht kommts ja irgendwann doch nochmal.
Die 4 Funktionen erzeugen lediglich jeweils 1-, 2-, 3- oder 4-dimensionale Ausgabewerte.
Es wäre wohl noch schön, wenn jemand mit aktueller ATI-Karte/-Treiber das ganze sicherheitshalber noch ausprobieren könnte, da die Infos ja alle nicht sonderlich neu sind. Ich kann derzeit nur für meine GF 8800GTS 512 mit 175.19 sprechen.
Es wäre wohl noch schön, wenn jemand mit aktueller ATI-Karte/-Treiber das ganze sicherheitshalber noch ausprobieren könnte, da die Infos ja alle nicht sonderlich neu sind. Ich kann derzeit nur für meine GF 8800GTS 512 mit 175.19 sprechen.
Getestet auf ner Radeon X1950 Pro mit den Treibern vom 4. Juli (aktuellste, 6.14.10.6833) InfoLog des FragmentShaders:
Zitat:
Fragment shader was successfully compiled to run on hardware.
Und des ProgramObjects:
Zitat:
Fragment shader(s) failed to link, vertex shader(s) linked. Fragment Shader not supported by HW
_________________ 2+2=5 For extremely large values of two
Mitglieder in diesem Forum: 0 Mitglieder und 12 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.