Als ich heute StoneQuest ausgeführt habe musste ich feststellen dass ein anderer Spieler einige Meter über mir schwebte!
Es hat sich heraus gestellt, dass die Landschaft unterschiedlich auf unseren Systemen berechnet wird. Diese wird über einen Pixelshader berechnet und zurück gelesen. Dabei wird eine Noisefunktion genutzt. Ich vermute das die Noisefunktion der Übeltäter ist.
Die Frage ist also, kann ich irgendwie gewährleisten, dass das Ergebnis der Berechnung immer standartisiert ist?
Mein einziger workaround wäre, die Werte für das Noise aus einer Textur zu lesen.
Im Moment verwende ich noch DX9, möchte aber auf OpenGl umsteigen... nur als Info falls das relevant sein sollte.
[Shader] Berechnungsproblem
-
- Establishment
- Beiträge: 426
- Registriert: 23.01.2013, 15:55
Re: [Shader] Berechnungsproblem
Gibt es überhaupt eine Garantie, dass auf der GPU Gleitkommawerte immer einem Standard folgen? Spätestens bei richtigen mathematischen Funktionen bin ich mir eigentlich ziemlich sicher, das grundsätzlich nicht. Das gibt es ja nicht einmal auf der CPU. Und ob die Texturinterpolation immer gleich arbeitet wird auch nicht definiert sein. Bei OpenGL weiß ich das es eine mehr oder weniger neue Core-Feature/Extension gibt, die Grenzwerte für die Funktionen festlegt, die eingehaltenen werden müssen. (4.1 oder ARB_shader_precision) Ich interpretiere das so: 1. Normalerweise darf man sich auf gar nichts verlassen und 2. selbst wenn, es gibt nahezu keine strengen Garantien und nur für die grundlegendsten Funktionen. Ich glaube kaum, dass es bei DirectX 9 anders ist. Das ist schließlich 7-8 Jahre vor "ARB_shader_precision" herausgekommen.
Zuletzt geändert von Spiele Programmierer am 25.06.2014, 11:23, insgesamt 1-mal geändert.
- Krishty
- Establishment
- Beiträge: 8350
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [Shader] Berechnungsproblem
Benutz Hardware ab Direct3D-10-Klasse.
D3D 9 garantiert intern nur 16 Bits Rechenpräzision; viele alte Karten arbeiten mit 24; D3D-10-Karten oft mit 32. Da rühren deine unterschiedlichen Ergebnisse her.
D3D 10 garantiert interne Präzision von 32 Bits und hält sich, abgesehen von Denormals / NaN / inf, an den IEEE 754-Standard (ist also weitestgehend mit der CPU austauschbar).
D3D 9 garantiert intern nur 16 Bits Rechenpräzision; viele alte Karten arbeiten mit 24; D3D-10-Karten oft mit 32. Da rühren deine unterschiedlichen Ergebnisse her.
D3D 10 garantiert interne Präzision von 32 Bits und hält sich, abgesehen von Denormals / NaN / inf, an den IEEE 754-Standard (ist also weitestgehend mit der CPU austauschbar).