C++ | IDirect3DDevice9::StretchRect | Bildfehler

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Goderion
Beiträge: 82
Registriert: 16.09.2012, 12:02

C++ | IDirect3DDevice9::StretchRect | Bildfehler

Beitrag von Goderion »

Hallo.

Wenn ich per StretchRect ein Surface auf den BackBuffer "kopiere", bekomme ich eine vertikale und horizontale "Bildstörung".
Die Störung schneidet quasi mittig einmal von Rechts nach Links und einmal von Oben nach Unten.

Sobald die Höhe und Breite vom SourceSurface gleich oder exakt ein Vielfaches von Höhe und Breite vom Backbuffer ist, benutze ich bei StrechRect das Flag D3DTEXF_POINT.
In diesem Beispiel ist die Quelle/RenderTarget 640x360 groß, und das Ziel/Backbuffer 1280x720 groß, also ist der Backbuffer exakt doppelt so breit und doppelt so hoch.
Beim Present werden für das Source -und DestRect die gleichen Werte genommen (0, 0, 1280, 720).
Wenn ich beim StretchRect beim Source -und beim DestRect Null übergebe, bleiben die Störungen bestehen.

Um das ganze genau zu prüfen und Fehler an anderen Stellen auszuschließen, speicher ich das SourceSurface direkt vor dem StretchRect in eine Datei.
Direct nach dem StretchRect speicher ich den Backbuffer auch in eine Datei.

Die Datei vom SourceSurface habe ich zu Vergleichszwecken auf die Größe vom Backbuffer hochskaliert.
Beide Bilder finden sich im Dateianhang.

Wenn man sich die Bilder anguckt, bekommt man den Eindruck, als wäre das DestRect um ein Pixel zu groß (X und Y),
was aber definitiv nicht der Fall ist, zumindest nicht laut den Parametern, mit der die Funktion StretchRect aufgerufen wird.

Jemand eine Idee was da los ist und wie ich das korrigieren kann?
Dateianhänge
rendertarget.png
backbuffer.png
Alexander Kornrumpf
Moderator
Beiträge: 2106
Registriert: 25.02.2009, 13:37

Re: C++ | IDirect3DDevice9::StretchRect | Bildfehler

Beitrag von Alexander Kornrumpf »

Goderion hat geschrieben:(0, 0, 1280, 720) [...]

Wenn man sich die Bilder anguckt, bekommt man den Eindruck, als wäre das DestRect um ein Pixel zu groß (X und Y),
was aber definitiv nicht der Fall ist, zumindest nicht laut den Parametern, mit der die Funktion StretchRect aufgerufen wird.
Ich kenne das API nicht, daher ganz doof gefragt: ist die Obergrenze vielleicht einschließlich? Pixel 0 bis einschließlich Pixel 1280 sind 1281 Pixel.
Benutzeravatar
Goderion
Beiträge: 82
Registriert: 16.09.2012, 12:02

Re: C++ | IDirect3DDevice9::StretchRect | Bildfehler

Beitrag von Goderion »

Alexander Kornrumpf hat geschrieben:Ich kenne das API nicht, daher ganz doof gefragt: ist die Obergrenze vielleicht einschließlich? Pixel 0 bis einschließlich Pixel 1280 sind 1281 Pixel.
Darüber habe ich auch schon nachgedacht, aber dadurch das sich das Verhalten nicht ändert, wenn man das Quell und Ziel-Rechteck nicht angibt, denke ich nicht, dass es das ist.
Beim Weglassen vom Quell und Ziel-Rechteck wird automatisch alles genommen und die Quelle ist im Problemfall exakt halb so breit (X) und halb so hoch (Y) wie das Ziel.

Wenn die Quelle und das Ziel gleich groß sind, gibt es keine Bildfehler, egal ob mit angegebenen Rechtecken oder ohne.

Wenn ich das SourceSurface/RenderTarget als Textur in den Backbuffer renderere (DrawPrimitive), sieht alles korrekt aus und ist sogar etwas schneller (von 296 auf 299 FPS, 1%).
Alexander Kornrumpf
Moderator
Beiträge: 2106
Registriert: 25.02.2009, 13:37

Re: C++ | IDirect3DDevice9::StretchRect | Bildfehler

Beitrag von Alexander Kornrumpf »

Goderion hat geschrieben:
Alexander Kornrumpf hat geschrieben:Ich kenne das API nicht, daher ganz doof gefragt: ist die Obergrenze vielleicht einschließlich? Pixel 0 bis einschließlich Pixel 1280 sind 1281 Pixel.
Darüber habe ich auch schon nachgedacht, aber dadurch das sich das Verhalten nicht ändert, wenn man das Quell und Ziel-Rechteck nicht angibt, denke ich nicht, dass es das ist.
Beim Weglassen vom Quell und Ziel-Rechteck wird automatisch alles genommen und die Quelle ist im Problemfall exakt halb so breit (X) und halb so hoch (Y) wie das Ziel.

Wenn die Quelle und das Ziel gleich groß sind, gibt es keine Bildfehler, egal ob mit angegebenen Rechtecken oder ohne.

Wenn ich das SourceSurface/RenderTarget als Textur in den Backbuffer renderere (DrawPrimitive), sieht alles korrekt aus und ist sogar etwas schneller (von 296 auf 299 FPS, 1%).
War jetzt doch neugierig, Doku sagt, du hast Recht, bottom/right von RECT ist per Konvention exklusiv: https://msdn.microsoft.com/de-de/librar ... 85%29.aspx
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: C++ | IDirect3DDevice9::StretchRect | Bildfehler

Beitrag von Zudomon »

Bei StretchRect wäre ich sowieso vorsichtig. Ich hatte schon Fälle, da lief das aus irgendeinem Grund nicht. Also ich meine auf anderer Hardware. Ich weiß nicht, ob eine selbstgebaute Funktion Nachteile bringt in der Ausführungsgeschwindigkeit, aber eventuell könntest du darauf ausweichen.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: C++ | IDirect3DDevice9::StretchRect | Bildfehler

Beitrag von Krishty »

Was heißt „lief nicht“? Welche konkrete Situation? MSDN listet für StretchRect() 13(!) grundsätzliche Einschränkungen auf, zwei verschiedene Caps-Strukturen, und vier Diagramme über Treiberkompatibilität. Lief es nicht obwohl du das alles beachtet hast, oder lief es prinzipiell nicht und du wusstest das und musstest eine eigene Funktion bauen, oder lief es nur manchmal, oder …?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: C++ | IDirect3DDevice9::StretchRect | Bildfehler

Beitrag von Zudomon »

Es lief bei mir, bei vielen anderen aber halt bei 1-2 Leuten nicht. Also das Rendering lieferte nicht das gleiche Ergebnis. Konnte es auf StretchRect zurückführen, wo das Kopieren nicht ausgeführt wurde. Hab die Funktion dann durch eine eigene ersetzt. Dann lief es überall. Das ist schon Jahre her. Weiß nicht mehr, was ich da alles beachtet habe. War auch nur ein Hinweis meinerseits ;)
Antworten