|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 26.02.2008, 19:30 Titel: Shader+Zeit=Problem(?) |
|
|
Ich hab das Problem bei einer schnellen google-Suche nur einmal auftauchen sehen, allerdings mit keiner wirklichen Lösung.
(Hier ist der betreffende Thread: http://www.gamedev.net/community/forums/topic.asp?topic_id=483583&whichpage=1�)
Die Sache ist die, dass Variablen, die regelmäßig inkrementiert werden, (also für die Zeit stehen) bei größeren Werten Probleme machen. Ich weiß nicht, woran es liegt, aber vermutet wird eine Ungenauigkeit von floats, mit denen die Shader nicht zurecht kommen.
Das Ergebnis eines "sin(time)" wird also bei hohen Werten für "time" extrem verfälscht. Das ganze lässt sich nicht nur im Programm, sondern auch im FX Composer von NVidia beobachten.
Nun meine Frage an diejenigen, die schon mal mit Shadern gearbeitet haben:
Hattet ihr änhliche Probleme? Workarounds? Lösungen? _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 26.02.2008, 20:40 Titel: |
|
|
Mach doch einfach ein:
Zitat: | if (Time>Threshold)
Time -= Threshold; |
Beim updaten der Zeit, Probleme hatte ich aber bisher noch selbst keine dabei sind diverse Zeitabhängige Shader schon mal eine Stunde lang zu sehen. |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 26.02.2008, 21:30 Titel: |
|
|
Das wurde ja auch in dem Thread vorgeschlagen.
Das Problem ist, dass man das halt nicht bei jedem Algo so handhaben kann, ohne dass Sprünge auftreten.
Zitat: | sin(time+3.14/4.0) != sin(-time+3.14/4.0) |
Je nachdem, wie das im Einzelnen aussieht, kanns da schon extreme Phasensprünge geben, die unangenehm auffallen würden. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 26.02.2008, 23:57 Titel: |
|
|
Meine These: Du hast nur begrenzten Speicher zu Verfügung. Daher wirst du die Zeit immer nur mit Einschränkungen erfassen können (maximale Dauer, Genauigkeit).
floats sind so gebaut, das ihre Genauigkeit mit ihrere Größe anwächst.
Egal was du machst, der Shader kann nur so lange laufen, wie er unter diesen Grenzen bleibt. Du kannst irgendwie versuchen, mehr Speicher zu benutzen, oder du musst den Shader sich wiederhohlen lassen. Dafür musst du eine Stelle finden, an der der Übergang möglichst sanft, bzw. nicht vorhanden ist. Notfalls musst du den Shader so anpasse, dass irgendwo innerhalb der Grenzen eine solche Stelle entsteht.
Wenn ich jetzt nicht totale Scheiße verzapft habe, sind das die 2 einzigen Möglichkeiten, die dir bleiben.
Gute Nacht. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Sören JLI Master Trainee
Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 27.02.2008, 01:16 Titel: |
|
|
Ich bin mit der Problematik nicht vertraut, aber was wäre zB mit:
Code: |
if(time >= 2.0*Pi)
time -= 2.0*Pi;
|
So ist time im Allgemeinen im Bereich [0, 2*Pi] und der Sinusfunktion sollte das nicht stören, weil diese 2*Pi-periodisch ist.
PS.: Als weiterführenden Gedanken: Falls auch der Fehler bei ungefähr 2*Pi auch schon merkbar ist, kann man time auch noch in den Intervall [-Pi, Pi] halten. Ist ja äquivalent, aber der Betrag von time ist noch kleiner. |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 27.02.2008, 13:35 Titel: |
|
|
es könnte aber auch sein, dass man mehrere Sinusfunktionen hat, vielleicht eine mit nem Faktor. Und dann wäre das halt schwer, einen guten Übergang zu finden. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 27.02.2008, 13:50 Titel: |
|
|
Genau das ist das Problem.
Ich hab in einem Programm mehrere verschiedene Shader, die Trigonometriefunktionen auf unterschiedliche Weise nutzen. Manchmal ist bei sin(x) dieses x auch abhängig von den Texturkoordinaten. Ist also unmöglich, das außerhalb zu berechnen.
Jonathan_Klein hat Folgendes geschrieben: | Meine These: Du hast nur begrenzten Speicher zu Verfügung. Daher wirst du die Zeit immer nur mit Einschränkungen erfassen können (maximale Dauer, Genauigkeit).
floats sind so gebaut, das ihre Genauigkeit mit ihrere Größe anwächst. |
So siehts aus, das komische ist, dass das ganze schon mehr oder weniger deutlich ab 3-4-stelligen Zahlen zu sehen ist. (Nach ner Stunde=360.0f sind also schon Unterschiede feststellbar.)
Was mir jetzt gerade kommt ist die Idee, anstatt einem Float einen Integer mit der Einheit Millisekunden (oder ggf. tiefer) zu nehmen. Ich weiß allerdings nicht, ob das hilft. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 27.02.2008, 14:29 Titel: |
|
|
Die Genauigkeit von float in der Größenordnung 300 lässt schon deutlich nach, ist halt so. Ich sehe auch nur die Möglichkeit dass du deine Shader irgendwie umbiegst, das jeder mit einem vielfachen von pi arbeitet. Entsprechende offsets kannst du dann direkt in den Shadercode schreiben.
(oder vielleicht mehrere Zeitvariablen nehmen)
Mit int kannst du mal probieren, aber wenn du den Wert ins Unendliche laufen lässt, ist doch auch irgendwie schlechter Code. |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 27.02.2008, 16:17 Titel: |
|
|
KI hat Folgendes geschrieben: | Die Genauigkeit von float in der Größenordnung 300 lässt schon deutlich nach, ist halt so. |
Gut zu wissen. Dachte, das sei erst bei ab 8-stelligen o.ä. der Fall.
KI hat Folgendes geschrieben: | Ich sehe auch nur die Möglichkeit dass du deine Shader irgendwie umbiegst, das jeder mit einem vielfachen von pi arbeitet. |
Das wird halt schwer, wenn der betreffende Wert noch mit diversen Rechenoperationen (wie gesagt auch z.T. innerhalb des Shaders abhängig) verändert wird und damit ein Phasensprung geschaffen würde. Es sind ja nicht nur offsets, sondern hin und wieder Komplexeres.
KI hat Folgendes geschrieben: | Mit int kannst du mal probieren, aber wenn du den Wert ins Unendliche laufen lässt, ist doch auch irgendwie schlechter Code. |
Gegeben, es wird die Einheit Millisekunden gewählt, hätte man da immerhin erst alle 4.294.967.296 Millisekunden einen Sprung, d h. alle ~49 Tage.
Da der Mensch sowieso im Raum von 30fps flüssig sieht, wäre jedes Frame 33 1/3 ms lang. Also könnte man noch mal mehr in diesem Integer unterbringen. Ich inkrementiere den Zeitcounter sowieso nur alle 10 ms. Insofern würde die Genauigkeit da wohl ausreichen (wenn sie sich nicht durch die Rechenoperationen weiter verkleinert. Aber da es da jetzt in meiner Theorie aufhört, muss ich das wohl ausprobieren.)
Da allerdings beide 4 Byte belegen, ist fraglich, ob man damit was rausschlagen kann. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|