JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=dbfd1e14c79ac09155c71fde1c9b8574Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Shader+Zeit=Problem(?)

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
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

BeitragVerfasst am: 26.02.2008, 19:30    Titel: Shader+Zeit=Problem(?) Antworten mit Zitat

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&#3165162)

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 26.02.2008, 20:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 26.02.2008, 21:30    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 26.02.2008, 23:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Sören
JLI Master Trainee



Anmeldedatum: 26.07.2002
Beiträge: 647
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 27.02.2008, 01:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 27.02.2008, 13:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 27.02.2008, 13:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 27.02.2008, 14:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 27.02.2008, 16:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum