Problem mit Surface(Direct3D)

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Problem mit Surface(Direct3D)

    Hi
    Ich arbeite mich gerade in DirectX ein und versuche ein Surface zu erstellen. Das funktioniert auch schon ganz gut. Ich erstelle ein Surface und versuche, es in den BackBuffer des Devices zu schreiben:

    VB.NET-Quellcode

    1. Dim backbuffer As Surface = .GetBackBuffer(0, 0, BackBufferType.Mono)
    2. .StretchRectangle(surMenuSurface, _
    3. Nothing, _
    4. backbuffer, _
    5. Nothing, _
    6. txfFilter)


    Das endet allerdings mit der aufschlussreichen Fehlermeldung "Error in the Application", wie bei DX üblich :D. Ich habe rausgefunden, dass das wohl an der Usage liegt(Surface.Description.Usage), die beim Backbuffer RenderTarget und bei meinem Surface None ist. Weiß jemand, wie man das Problem lösen kann?

    Übrigens: So instanziere ich die Bestandteile
    Device:

    VB.NET-Quellcode

    1. Dim pp As New PresentParameters
    2. pp.Windowed = True
    3. pp.SwapEffect = SwapEffect.Discard
    4. pp.DeviceWindowHandle = Me.Handle
    5. pp.DeviceWindow = Me
    6. pp.BackBufferFormat = Format.A8R8G8B8
    7. pp.BackBufferWidth = Me.ClientSize.Width
    8. pp.BackBufferHeight = Me.ClientSize.Height
    9. dDevice = New Device(0, DeviceType.Hardware, Me, CreateFlags.SoftwareVertexProcessing, pp)


    Surface

    VB.NET-Quellcode

    1. Public Sub New(ByVal Device As Device)
    2. ctrParent = Device.PresentationParameters.DeviceWindow
    3. surMenuSurface = Surface.FromBitmap(Device, New Bitmap(ctrParent.ClientSize.Width, ctrParent.ClientSize.Height, Imaging.PixelFormat.Format32bppArgb), Pool.Default)
    4. End Sub


    surMenuSurface ist mein Surface und dDevice mein Device *seltsam ne?*

    Gruß
    ~blaze~
    Ich versuch eine Art Menu zu erstellen. Bin ja erst Anfänger, was DirectX angeht und für mich wär son Hauptmenü schon mal was tolles :D ... In nem anderen Programm hab ich versucht, damit einen Screenshot aufzunehmen. Das hat auch ganz gut geklappt(Sogar ohne Fehler!!). Aber bei dem momentanen Projekt check ich nich ganz, was ich anders gemacht hab. Hab eigentlich das als Vorlage genommen, deswegen hab ich mich gewundert...

    Gruß
    ~blaze~
    Hehe die Antwort hab ich auch schon gelesen :D (google lässt grüßen). Aber ich würde es trotzdem gerne mit dem Backbuffer versuchen - schon alleine deswegen, weil solche Probleme wieder auftreten können :/ (z.B. wenn ich den Backbuffer mal wieder bräuchte).

    Gibt es eigentlich eine Entwickler-Edition von DirectX, indenen die Fehler abgefangen werden? *Frag, um die Wut über die Fehlerbeschreibungen rauszulassen :D*

    Gruß
    ~blaze~
    Jep, nach dem BeginScene(Bei beiden).

    Hier die Funktion zum Screenshot zeichnen

    VB.NET-Quellcode

    1. Private Function CreateScreenShot() As Bitmap
    2. Dim bmp As New Bitmap(Me.Width, Me.Height, Imaging.PixelFormat.Format24bppRgb)
    3. Dim graph As Graphics = Graphics.FromImage(bmp)
    4. Me.Opacity = 0
    5. graph.CopyFromScreen(New Point(Me.Left, Me.Top), New Point(0, 0), New Size(Me.Width, Me.Height))
    6. Me.Opacity = 1
    7. Return bmp
    8. End Function
    9. Public Sub UpdateScreenShot
    10. Private Sub UpdateLoupe()
    11. devDevice.Clear(ClearFlags.Target, Me.TransparencyKey, 0.1F, 0)
    12. devDevice.BeginScene()
    13. Dim backbuffer As Surface = devDevice.GetBackBuffer(0, 0, BackBufferType.Mono)
    14. Dim surf As New Surface(devDevice, CreateScreenShot, Pool.Default)
    15. Me.Location = MousePosition - New Point(Me.Width / 2, Me.Height / 2)
    16. devDevice.StretchRectangle(surf, New Rectangle(0, 0, Me.Width, Me.Height), backbuffer, New Rectangle(0, 0, Me.Width, Me.Height), TextureFilter.None)
    17. devDevice.EndScene()
    18. devDevice.Present()
    19. End Sub
    20. End Sub
    21. Public Sub New()
    22. InitializeComponent()
    23. Dim pp As New PresentParameters()
    24. pp.Windowed = True
    25. pp.SwapEffect = SwapEffect.Discard
    26. pp.BackBufferWidth = Me.Width
    27. pp.BackBufferHeight = Me.Height
    28. pp.DeviceWindowHandle = Me.Handle
    29. devDevice = New Device(0, _
    30. DeviceType.Hardware, _
    31. Me.Handle, _
    32. CreateFlags.SoftwareVertexProcessing, _
    33. pp)
    34. End Sub


    Das mit dem Opacity war zwar unschön, aber ich hatte da keine Zeit das anders zu lösen :thumbsup: ... Aber ich finds gut, dass das als erstes Projekt fehlerfrei lief.

    Gruß
    ~blaze~