PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verschiedene Framebufferausgabe in DirectX


pajofego
2004-07-14, 12:58:15
Hallo Leute,

mal wieder ein hoffentlich kleines Problem in DirectX (siehe dazu Bild.). Seit Monaten arbeite ich an meiner Lawinensimulation in DirctX/HLSL, jetzt wo ich den Code fertig habe, wollte ich mir mal das Ergebnis anschauen. Links auf dem Bild das Ergebnis in der Softwareemulation, so wie ich es auch gerne als Output hätte und rechts das Ergebnis auf der ATI 9800 Pro im Hardwaremodus. So, nun ging ich immer davon aus, dass was im Softwareemu-Modus von DirectX läuft würde auch auf der Grafikkarte gehen. Jetzt staune ich etwas über die gelben Gebiete ausserhalb der Lawine(Rot-Gelb-Grüne-Hellblauer Fleck). Hat einer von euch evt. eine Idee was das schief gegangen sein könnte?

Danke!

Gruss pajofego

Demirug
2004-07-14, 14:00:26
Das Wunder des Refrast.

Wenn das Bild vom Refrast und der Karte nicht übereinstimmen gibt es dafür mehrer Möglichkeiten.

1. Der Refrast hat einen Bug
2. Der Treiber hat einen Bug
3. Der Unterschied ergibt sich aus implementierungsunterschiede welche aber innerhalb der Spezifikation liegen. Zum Beispiel rechnet der Refrast mit FP32 und eine Radeon nur mit FP24.
4. Es werden Dinge benutzt die vorher nicht explizit gesetzt wurden. Da sich die Treiber da nicht immer an die Defaultwerte halten kann es Probleme geben.

In der Regel sollte man seine Software in solchen Fällen immer einmal mit anderer Hardware testen und schauen was diese tut.

pajofego
2004-07-14, 16:24:29
@Demirug

Das Austesten meines Programmes auf einer anderen Hardware gestaltet sich insoweit schwierig, weil ich folgenden Code sehr häufig benutze:
m_pd3dDevice->CreateTexture(1, 1, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R32F, D3DPOOL_DEFAULT, &m_pFloatTexture,0);

m_pd3dDevice->CreateTexture(1, 1, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R32F, D3DPOOL_SYSTEMMEM, &ms_pMainMemTexture,0);

Das hier wird in dieser Form von ATI unterstützt, in der FX Serie gingen FP-Texturen nur mit Hilfe eines Makros und dann auch nur im D3DPOOL_DEFAULT Modus:

m_pd3dDevice->CreateTexture(1, 1, 1, 0, (D3DFORMAT)MAKEFOURCC('N','V','E','d'), D3DPOOL_DEFAULT, &m_pFloatTexture, 0);

Ich weiss jetzt nicht wie es da mit Nvidias neuer Karte(6800) aussieht? Das wäre schön wenn sie o.g. Aufrufe unterstützen würde, zumal ich ja nur in FP32 rechne.

Zu 3: Ich werde mal morgen, wenn ich wieder Zugang zur 9800 habe, die Textur auslesen, um mal nachzuschauen ob ich da irgendwelche Rundungsfehler sehen kann.

Bei allen anderen Punkten läßt sich schwer eine Aussage machen. Mal sehen ob ich in den nächsten Tagen ein bischen Glück habe und herausbekomme, wo der Fehler ist.

Für alles erst einmal danke,

beste Grüße

pajofego

Demirug
2004-07-14, 16:41:05
R32F gibt es bei einer 6800.

pajofego
2004-07-15, 14:09:53
Fehlerquelle identifiziert! Nachdem ich ein bischen mit den compileroptionen von fxc gespielt hatte und feststellte, dass im optimierten Modus die gelben Stellen auch auf der reinen Softwareremulation auftauchten, machte ich mich auf die Suche in meinem HLSL Code. Durch Glück (die Betonung liegt hier auf Glück) habe ich die Stelle gefunden. Ich weiß zwar nicht ganz warum, aber irgendwie scheint es im Gebiet wo es gelb ist, Probleme mit der Genauigkeit bzw. mit dem Bereich außerhalb [0..1] zu haben. Mit der Funktion "saturate()" konnte das Problem erfolgreich behoben werden.