Ich habe eine C#-Anwendung, für die ich GDI+-Code geschrieben habe, der Bitmap/TextureBrush-Rendering verwendet, um 2D-Bilder darzustellen, auf die verschiedene Bildverarbeitungsfunktionen angewendet werden können. Dieser Code ist ein neuer Pfad in einer Anwendung, die bestehenden DX9-Code nachahmt, und sie teilen eine gemeinsame Bibliothek, um alle Vektor- und Matrix (z.B. ViewToWorld/WorldToView) Operationen durchzuführen. Meine Testumgebung besteht aus DX9-Ausgabebildern, die ich mit der Ausgabe des neuen GDI+-Codes vergleiche.
Ein einfacher Testfall, der in einem Ansichtsfenster gerendert wird, das mit den Bitmap-Abmessungen übereinstimmt (d. h. kein Zoom oder Schwenk) tut stimmen pixelgenau überein (kein binärer Unterschied) - aber sobald das Bild vergrößert wird, erhalte ich sehr geringe Unterschiede bei 5-10 % der Pixel. Die Größe des Unterschieds beträgt 1 (gelegentlich 2)/256. Ich vermute, dass dies auf Interpolationsunterschiede zurückzuführen ist.
Frage : Für eine DX9 Ortho-Projektion (und Identität Weltraum), mit einer Kamera senkrecht und zentriert auf einem texturierten Quad, ist es vernünftig zu erwarten DirectX.Direct3D.TextureFilter.Linear um eine identische Ausgabe wie bei einem mit GDI+ TextureBrush gefüllten Rechteck/Polygon zu erzeugen, wenn man die System.Drawing.Drawing2D.InterpolationMode.Bilinear Einstellung?
Für diesen Fall (Vergrößerung) verwendet der DX9-Code dies (MinFilter, MipFilter ähnlich eingestellt):
Device.SetSamplerState(0, SamplerStageStates.MagFilter, (int)TextureFilter.Linear);
und der GDI+-Pfad verwendet wird: g.InterpolationMode = InterpolationMode.Bilinear;
Ich dachte, dass "Bilinear Interpolation" eine ziemlich spezifische Filterdefinition war, aber dann bemerkte ich, dass es eine weitere Option in GDI+ für "HighQualityBilinear" (die ich versucht habe, ohne Unterschied - was angesichts der Beschreibung der "zusätzlichen Vorfilterung zum Schrumpfen" Sinn macht)
Folgefrage: Ist es vernünftig, eine pixelgenaue Übereinstimmung zwischen DirectX und GDI+ zu erwarten (vorausgesetzt, alle externen Koordinaten sind gleich)? Wenn nicht, warum nicht?
Klarstellung: Die Bilder, die ich verwende, sind opake Graustufen (R=G=B, A=1) mit Format32bppPArgb.
Schließlich gibt es eine Reihe von anderen APIs, die ich verwenden könnte (Direct2D, WPF, GDI, etc.) - und diese Frage gilt im Allgemeinen zum Vergleich der Ausgabe von "äquivalenten" bilinear interpolierte Ausgabe Bilder über zwei dieser. Vielen Dank!