Direct2D: Einfacher Zeichenvorgang

  • VB.NET

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

    Direct2D: Einfacher Zeichenvorgang

    Ich bin schon seit einiger Zeit dabei, ein eigenes 2D Top-Down Spiel zu erstellen. Bis jetzt habe ich alles mit GDI+ gezeichnet und hatte auch keine großartigen Probleme, allerdings ist mir aufgefallen, dass die FPS bei vielen Images doch schon ziemlich schnell den Bach runter gehen (trotz Bitmap-BackBuffer und guter GameLoop). Daher habe ich mich nach einiger Zeit Suche dafür entschieden es jetzt mit SlimDX zu versuchen. Doch leider habe ich nur C++ Tutorials gefunden, welche ich dann versucht habe irgendwie in VB.Net zu übersetzen. Da ich mich aber noch nicht wirklich mit C++ auskenne scheinen mir da immer wieder Fehler unterlaufen zu sein.
    Deshalb suche ich jetzt einfach nur noch den Code für das Zeichnen von einfachen Bitmaps mithilfe von RenderTarget (falls es eine alternative Methode gibt, bin ich dafür natürlich auch offen).
    Wäre also nett, wenn mir einer dabei helfen könnte.
    Auch Dunkelheit kann Erleuchtung bringen...
    Was gibt es da denn für Unterschiede? SharpDX ist doch genauso wie SlimDX eine auf dem DirectX SDK basierende API.
    Auch Dunkelheit kann Erleuchtung bringen...
    SharpDX.Toolkit Direct2D Soll genau wie GDI+ funktionieren (Soweit ich das gehört habe).
    Ich selber hab bis jetzt nur SharpDX.Toolkit Direct3D benutzt deswegen kann ich das nicht so genau sagen.
    Und SlimDX kenn ich leider garnicht, deswegen kann ich da auch nichts zu sagen.
    Ich habe SharpDX jetzt runtergeladen und versuche mit Direct2D zu zeichnen.

    VB.NET-Quellcode

    1. Private Shared Sub Level1()
    2. Dim form = New RenderForm("Level1")
    3. Dim desc = New SwapChainDescription() With {
    4. .BufferCount = 1,
    5. .ModeDescription = New ModeDescription(form.ClientSize.Width, form.ClientSize.Height, New Rational(60, 1), Format.R8G8B8A8_UNorm),
    6. .IsWindowed = True,
    7. .OutputHandle = form.Handle,
    8. .SampleDescription = New SampleDescription(1, 0),
    9. .SwapEffect = SwapEffect.Discard,
    10. .Usage = Usage.RenderTargetOutput
    11. }
    12. Dim device As Device1
    13. Dim swapChain As SwapChain
    14. Device1.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.BgraSupport, desc, FeatureLevel.Level_10_0, device, swapChain)
    15. Dim d2dFactory = New SharpDX.Direct2D1.Factory()
    16. Dim width As Integer = form.ClientSize.Width
    17. Dim height As Integer = form.ClientSize.Height
    18. Dim rectangleGeometry = New RoundedRectangleGeometry(d2dFactory, New RoundedRectangle() With {
    19. .RadiusX = 32,
    20. .RadiusY = 32,
    21. .Rect = New SharpDX.RectangleF(128, 128, width - 128 * 2, height - 128 * 2)
    22. })
    23. Dim factory As Factory = swapChain.GetParent(Of Factory)()
    24. factory.MakeWindowAssociation(form.Handle, WindowAssociationFlags.IgnoreAll)
    25. Dim backBuffer As Texture2D = Texture2D.FromSwapChain(Of Texture2D)(swapChain, 0)
    26. Dim renderView = New RenderTargetView(device, backBuffer)
    27. Dim surface As Surface = backBuffer.QueryInterface(Of Surface)()
    28. Dim d2dRenderTarget = New RenderTarget(d2dFactory, surface, New RenderTargetProperties(New PixelFormat(Format.Unknown, AlphaMode.Premultiplied)))
    29. Dim solidColorBrush = New SolidColorBrush(d2dRenderTarget, SharpDX.Color.White)
    30. Dim stopwatch As New Stopwatch()
    31. stopwatch.Start()
    32. RenderLoop.Run(form, Sub()
    33. d2dRenderTarget.BeginDraw()
    34. d2dRenderTarget.Clear(SharpDX.Color.Black)
    35. 'draw here:
    36. d2dRenderTarget.EndDraw()
    37. swapChain.Present(0, PresentFlags.None)
    38. End Sub)
    39. renderView.Dispose()
    40. backBuffer.Dispose()
    41. device.ClearState()
    42. device.Flush()
    43. device.Dispose()
    44. device.Dispose()
    45. swapChain.Dispose()
    46. factory.Dispose()
    47. End Sub


    Allerdings bekomme ich immer einen Error beim Debuggen in Zeile 16:

    DLLNotFoundException wurde nicht behandelt:
    Die DLL "d3d10_1.dll": Das angegebene Modul wurde nicht gefunden. (Ausnahme von HRESULT: 0x8007007E) kann nicht geladen werden.

    Aber eigentlich habe ich alle notwendigen DLLs importiert.
    Kann mir einer sagen, wo das Problem liegt?
    Auch Dunkelheit kann Erleuchtung bringen...
    Hier ist ein kleiner Ausschnitt aus GameUtils:

    C-Quellcode

    1. public void Initialize(Control surface, RendererPresentation presentationOption)
    2. {
    3. this.surface = surface;
    4. layers = new Stack<Layer>();
    5. d2dFactory = new SharpDX.Direct2D1.Factory(SharpDX.Direct2D1.FactoryType.MultiThreaded);
    6. var props = new HwndRenderTargetProperties();
    7. props.Hwnd = surface.Handle;
    8. props.PixelSize = new DrawingSize(surface.ClientSize.Width, surface.ClientSize.Height);
    9. props.PresentOptions = presentationOption == RendererPresentation.Immediately ? PresentOptions.Immediately : PresentOptions.RetainContents;
    10. target = new WindowRenderTarget(d2dFactory, new RenderTargetProperties(), props);
    11. target.DotsPerInch = new DrawingSizeF(96, 96);
    12. textFactory = new SharpDX.DirectWrite.Factory();
    13. initialized = true;
    14. }
    Du brauchst also im Prinzip nur eine Factory und ein WindowRenderTarget.
    Jetzt hat er schon wieder den selben Error bekommen bei:
    Dim d2dFactory = New SharpDX.Direct2D1.Factory(SharpDX.Direct2D1.FactoryType.MultiThreaded)
    Nur das er jetzt die D2D1.dll nicht finden kann.
    Auch Dunkelheit kann Erleuchtung bringen...
    Ich hab die in den Debug-Ordner kopiert.
    Immernoch der Error:
    Die DLL "d2d1.dll": Das angegebene Modul wurde nicht gefunden. (Ausnahme von HRESULT: 0x8007007E) kann nicht geladen werden.
    Auch Dunkelheit kann Erleuchtung bringen...

    Karabonga schrieb:

    windows xp
    Ah, das könnte einiges erklären. Windows XP unterstützt maximal Direct3D9, aber Direct2D verwendet intern Direct3D10.1. Wenn ich mich also nicht täusche, dann gibts folglich unter Windows XP auch kein Direct2D.
    Da du GDI+ ja schon verworfen hast belibt wohl nur, entweder Direct3D9 oder OpenGL zu verwenden. Es sei aber gesagt, dass diese APIs um ein Vielfaches komplizierter sind, als GDI+ oder Direct2D. AUßerdem funktionieren diese in 3D, also musst du dann mittels 3D 2D simulieren, so machts Direct2D zwar auch, aber du hast auf jeden Fall viel mehr Arbeit.