DirectX Bitmap zeichnen

  • VB.NET

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

    DirectX Bitmap zeichnen

    Guten Abend,

    Ich bin gerade dabei ein 2D-Spiel mit Direct2D zu schreiben. Bis jetzt wird auch alles gerendert, allerdings würde ich verschiedenen Objekten gerne Texturen geben.
    Das Problem liegt jetzt nur dabei, dass ich, wenn ich Bitmap per DrawBitmap() zeichnen will immer nur so halbtransparente blaue oder auch rote (je nach Grundfarbe) Rechtecke bekomme, was ja nicht Sinn des ganzen ist.
    Die Bilder lade ich momentan mit diesem Code:

    Quellcode

    1. Public Shared Function LoadFromFile(ByVal renderTarget As RenderTarget, ByVal file As String) As Bitmap
    2. ' Loads from file using System.Drawing.Image
    3. Using bitmap = DirectCast(System.Drawing.Image.FromFile(file), System.Drawing.Bitmap)
    4. Dim sourceArea = New System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height)
    5. Dim bitmapProperties = New BitmapProperties(New PixelFormat(Format.R8G8B8A8_UNorm, Direct2D1.AlphaMode.Premultiplied))
    6. Dim size = New Size2(bitmap.Width, bitmap.Height)
    7. ' Transform pixels from BGRA to RGBA
    8. Dim stride As Integer = bitmap.Width * 4
    9. Using tempStream = New DataStream(bitmap.Height * stride, True, True)
    10. ' Lock System.Drawing.Bitmap
    11. Dim bitmapData = bitmap.LockBits(sourceArea, Imaging.ImageLockMode.[ReadOnly], System.Drawing.Imaging.PixelFormat.Format32bppPArgb)
    12. ' Convert all pixels
    13. For y As Integer = 0 To bitmap.Height - 1
    14. Dim offset As Integer = bitmapData.Stride * y
    15. For x As Integer = 0 To bitmap.Width - 1
    16. ' Not optimized
    17. Dim B As Byte = Runtime.InteropServices.Marshal.ReadByte(bitmapData.Scan0, System.Math.Max(System.Threading.Interlocked.Increment(offset), offset - 1))
    18. Dim G As Byte = Runtime.InteropServices.Marshal.ReadByte(bitmapData.Scan0, System.Math.Max(System.Threading.Interlocked.Increment(offset), offset - 1))
    19. Dim R As Byte = Runtime.InteropServices.Marshal.ReadByte(bitmapData.Scan0, System.Math.Max(System.Threading.Interlocked.Increment(offset), offset - 1))
    20. Dim A As Byte = Runtime.InteropServices.Marshal.ReadByte(bitmapData.Scan0, System.Math.Max(System.Threading.Interlocked.Increment(offset), offset - 1))
    21. Dim rgba As Integer = R Or (G << 8) Or (B << 16) Or (A << 24)
    22. tempStream.Write(rgba)
    23. Next
    24. Next
    25. bitmap.UnlockBits(bitmapData)
    26. tempStream.Position = 0
    27. Return New Bitmap(renderTarget, size, tempStream, stride, bitmapProperties)
    28. End Using
    29. End Using
    30. End Function


    und ich zeichne das ganze mit:

    Quellcode

    1. target.BeginDraw()
    2. target.Clear(backgroundColor)
    3. With target
    4. .DrawBitmap("Bitmap aus oberer Funktion", New RectangleF("X", "Y", "Breite", "Höhe"), 1, BitmapInterpolationMode.Linear)
    5. End With
    6. target.EndDraw()


    Ich hoffe mir kann jemand erklären, wo der Fehler liegt.
    Danke schon mal im Voraus.
    Auch Dunkelheit kann Erleuchtung bringen...
    Welchen DirectX Wrapper verwendest du denn?
    Ist das die Bitmap-Klasse aus dem .Net Framework?
    Und warum zur hölle liest du alle pixel aus dem Bild aus, um sie anschließend wieder reinzuschreiben? Wenn das Format nicht passen soll(farben vertauscht), dann nimm einfach das richtige^^
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Vermutlich SharpDX, der Code kommt mir nämlich stark bekannt vor aus GameUtils und ist laut meinen Recherchen der einzige Weg, eine Direct2D-Bitmap mit SharpDX aus einer Datei zu laden.
    Siehe auch github.com/Artentus/GameUtils/…rect2D/Direct2DTexture.cs
    Ich konnte damit aber bisher noch keine Probleme feststellen, funktioniert für mich einwandfrei.
    Erstmal danke.
    Das Problem ist nur, wenn ich die graue Steintextur im jpg Format zu zeichnen versuche, dann zeigt er mir die auf der Form als Rechtecke an, welche komplett einfarbig sind.
    Wenn ich Clear("Weiße Farbe") ausführe, bekomme ich auch weiße Rechtecke, die man nicht sehen kann. Wenn ich Clear("Schwarze Farbe") ausführe, bekomme ich rote Rechtecke.
    Falls das wichtig ist, ich verwende meine selbst erstellte Renderloop und ich zeichne direkt auf eine Windows Form. Ansonsten beeinträchtigt das Zeichnen das Programm allerdings nicht. Ich hoffe mal, dass das ausreicht, um den Fehler zu finden. Ich war jetzt nämlich schon die letzten Tage auf Google unterwegs, um das Problem zu finden. Und jetzt bin ich so langsam am Ende meiner Ideen :D.
    PS: Ich verwende SharpDX.
    Auch Dunkelheit kann Erleuchtung bringen...
    Hört sich für mein laienhaftes DirectX-Wissen danach an, als hättest du AlphaBlending eingeschaltet. Vor dem Zeichnen der Bitmap ausschalten und sehen was passiert.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.