[SlimDX] DirectX10 (D2D) vs DirectX11 (D2D_1)

  • C#
  • .NET (FX) 4.0

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ThuCommix.

    [SlimDX] DirectX10 (D2D) vs DirectX11 (D2D_1)

    Hallo,

    Ich möchte das nur ein bestimmter teil eines Bildes gezeichnet wird. Dies geschieht unter DirectX11 (SharpDX) mit diesem Code:

    C#-Quellcode

    1. DirectXHelper.RenderTarget.DrawBitmap(dxBmp,
    2. new RectangleF(position.X, position.Y, spriteSheet.Rectangle.Width, spriteSheet.Rectangle.Height), opacity,
    3. _interpolationMode == InterpolationMode.Linear
    4. ? BitmapInterpolationMode.Linear
    5. : BitmapInterpolationMode.NearestNeighbor, DirectXHelper.ConvertRectangle(spriteSheet.Rectangle));


    Zuerst das DestinationRectangle und am Ende das SourceRectangle. Das Ergebnis sieht wie folgt aus:



    Das wäre das korrekte Erscheinungsbild, und sieht unter DirectX9 sowie GDI gleich aus. DirectX10 hingegen, produziert mit dem selben Code ein verzerrtes Bild:



    Die Ausgangswerte sind alle gleich, aber Direct2D (Dx10) scheint internal irgendwas falsch zu resizen.. Kennt jemand das Problem, und konnte es erfolgreich lösen?
    Einen Bug halte ich für unwahrscheinlich, mir ist noch nie einer in irgend ner DirectX-API untergekommen. Wäre auch fatal, wenn bereits sowas einfaches nicht korrekt funktioniert.
    D2D für DX10 funktioniert aber schon ein Stückchen anders als für DX11, musst mal schaun, ob du irgendwo einstellen kannst, was für Einheiten verwendet werden (da gibts sowas ähnliches wie DPI-Einstellungen, heißt n bisschen anders, der Name ist mir entfallen, schon zu lange kein D2D mehr benutzt).
    Dpi sind so vorhanden, und ich denke ich habe diese auch richtig gesetzt:

    C#-Quellcode

    1. ​ SizeF dpi = d2DFactory.DesktopDpi;
    2. RenderTarget renderTarget = RenderTarget.FromDXGI(d2DFactory, backBuffer, new RenderTargetProperties
    3. {
    4. HorizontalDpi = dpi.Width,
    5. VerticalDpi = dpi.Height,
    6. MinimumFeatureLevel = SlimDX.Direct2D.FeatureLevel.Default,
    7. PixelFormat = new PixelFormat(Format.R8G8B8A8_UNorm, AlphaMode.Premultiplied),
    8. Type = RenderTargetType.Hardware,
    9. Usage = RenderTargetUsage.None
    10. });
    Dann musst du noch prüfen, ob das Bild die selben DPI hat, von GDI+ kenn ich, dass es sonst anfängt rumzuspinnen.

    Ansonsten würd ich die DPI eher fix festlegen, ist bei SPielen imo besser, ansonsten wird alles entsprechend gestretcht, was dann in kaputten Mechanics enden kann. Spiele skalieren normalerweise nach Fenster-/Bildschirmgröße.