DirectX-Programmierungs-Problem

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von jonichecker.

    DirectX-Programmierungs-Problem

    Moin!

    Hab jetzt mal versucht mit DirectX anzufangen, aber ich krieg es noch nicht mal hin, ein Dreieck darzustellen:
    (trotz Buch-Anleitung)

    VB.NET-Quellcode

    1. Imports Microsoft.DirectX
    2. Imports Microsoft.DirectX.Direct3D
    3. Imports System.IO
    4. Public Class Form1
    5. Dim Direct3dDevice As Device
    6. Dim vbBuffer_Dreieck As Direct3D.VertexBuffer = Nothing
    7. Public Sub oncreateDevice(ByVal sender As Object, ByVal e As EventArgs)
    8. Dim dev As Direct3D.Device = CType(sender, Direct3D.Device)
    9. vbBuffer_Dreieck = New Direct3D.VertexBuffer(GetType(Direct3D.CustomVertex.TransformedColored), 3, dev, 0, Direct3D.CustomVertex.TransformedColored.Format, Direct3D.Pool.Default)
    10. AddHandler vbBuffer_Dreieck.Created, AddressOf Me.oncreatevertexbuffer
    11. Me.oncreatevertexbuffer(vbBuffer_Dreieck, Nothing)
    12. End Sub
    13. Public Sub oncreatevertexbuffer(ByVal sender As Object, ByVal e As EventArgs)
    14. Dim vb As Direct3D.VertexBuffer = CType(sender, Direct3D.VertexBuffer)
    15. Dim verts As Direct3D.CustomVertex.TransformedColored() = CType(vb.Lock(0, 0), Direct3D.CustomVertex.TransformedColored())
    16. verts(0).X = 150
    17. verts(0).Y = 50
    18. verts(0).Z = 0.5F
    19. verts(0).Rhw = 1
    20. verts(0).Color = System.Drawing.Color.Brown.ToArgb()
    21. verts(1).X = 250
    22. verts(1).Y = 250
    23. verts(1).Z = 0.5F
    24. verts(1).Rhw = 1
    25. verts(1).Color = System.Drawing.Color.LightPink.ToArgb()
    26. verts(2).X = 50
    27. verts(2).Y = 250
    28. verts(2).Z = 0.5F
    29. verts(2).Rhw = 1
    30. verts(2).Color = System.Drawing.Color.LightPink.ToArgb()
    31. End Sub
    32. Sub New()
    33. InitializeComponent()
    34. CreateDirect3DDevice(Me)
    35. Render()
    36. End Sub
    37. Public Function CreateDirect3DDevice(ByVal ByValHandle As Form) As Boolean
    38. Try
    39. Dim presentParams As New Direct3D.PresentParameters()
    40. presentParams.Windowed = True
    41. presentParams.SwapEffect = Direct3D.SwapEffect.Discard
    42. Direct3dDevice = New Direct3D.Device(0, Direct3D.DeviceType.Hardware, Handle, Direct3D.CreateFlags.HardwareVertexProcessing, presentParams)
    43. Return True
    44. Catch ex As DirectXException
    45. Return False
    46. End Try
    47. Render()
    48. End Function
    49. Private Sub Render()
    50. Direct3dDevice.Clear(Direct3D.ClearFlags.Target, System.Drawing.Color.Blue, 1.0F, 0)
    51. Direct3dDevice.BeginScene()
    52. Direct3dDevice.SetStreamSource(0, vbBuffer_Dreieck, 0)
    53. Direct3dDevice.VertexFormat = Direct3D.CustomVertex.TransformedColored.Format
    54. Direct3dDevice.DrawPrimitives(Direct3D.PrimitiveType.TriangleList, 0, 1)
    55. Direct3dDevice.EndScene()
    56. Direct3dDevice.Present()
    57. End Sub
    58. End Class

    Da kommen dann vor Start folgende Fehlermeldungen:

    System.InvalidOperationException wurde nicht behandelt.
    Message="Fehler beim Erstellen des Formulars. Weitere Informationen finden Sie in Exception.InnerException. Fehler: Fehler in der Anwendung.."
    Source="DirectX"
    StackTrace:
    bei WindowsApplication1.My.MyProject.MyForms.Create__Instance__[T](T Instance) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 190.
    bei WindowsApplication1.My.MyProject.MyForms.get_Form1()
    bei WindowsApplication1.My.MyApplication.OnCreateMainForm() in (...)\Application.Designer.vb:Zeile 35.
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
    bei WindowsApplication1.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 81.
    bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
    bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
    bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
    bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    bei System.Threading.ThreadHelper.ThreadStart()
    InnerException: Microsoft.DirectX.Direct3D.InvalidCallException
    Message="Fehler in der Anwendung."
    Source="Microsoft.DirectX.Direct3D"
    ErrorCode=-2005530516
    ErrorString="D3DERR_INVALIDCALL"
    StackTrace:
    bei Microsoft.DirectX.Direct3D.Device.DrawPrimitives(PrimitiveType primitiveType, Int32 startVertex, Int32 primitiveCount)
    bei WindowsApplication1.Form1.Render() in (...)\Form1.vb:Zeile 60.
    bei WindowsApplication1.Form1..ctor() in (...)\Form1.vb:Zeile 40.
    InnerException:

    nach Klick auf Weiter:

    LoaderLock wurde erkannt.
    Message: Die DLL "C:\Windows\assembly\GAC\Microsoft.DirectX.Direct3DX\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.Direct3DX.dll" unternimmt einen Versuch, innerhalb der Sperre für den OS-Loader eine verwaltete Ausführung durchzuführen. Versuchen Sie nicht, verwalteten Code innerhalb einer DllMain- oder Bildinitialisierungsfunktion auszuführen, da dies ein Hängen der Anwendung zur Folge haben kann.

    VB.NET-Quellcode

    1. Imports Microsoft.DirectX
    2. Imports Microsoft.DirectX.Direct3D
    3. Imports System.IO
    4. Public Class Form1
    5. Dim dev As Device
    6. Dim vbBuffer_Dreieck As Direct3D.VertexBuffer = Nothing
    7. Sub New()
    8. InitializeComponent()
    9. Render()
    10. End Sub
    11. Public Sub OnCreateDevice(ByVal sender As Object, ByVal e As EventArgs)
    12. dev = CType(sender, Direct3D.Device)
    13. vbBuffer_Dreieck = New Direct3D.VertexBuffer(GetType(Direct3D.CustomVertex.TransformedColored), 3, dev, 0, Direct3D.CustomVertex.TransformedColored.Format, Direct3D.Pool.Default)
    14. AddHandler vbBuffer_Dreieck.Created, AddressOf Me.oncreatevertexbuffer
    15. Me.oncreatevertexbuffer(vbBuffer_Dreieck, Nothing)
    16. End Sub
    17. Public Sub OnCreateVertexBuffer(ByVal sender As Object, ByVal e As EventArgs)
    18. Dim vb As Direct3D.VertexBuffer = CType(sender, Direct3D.VertexBuffer)
    19. Dim verts As Direct3D.CustomVertex.TransformedColored() = CType(vb.Lock(0, 0), Direct3D.CustomVertex.TransformedColored())
    20. verts(0).X = 150
    21. verts(0).Y = 50
    22. verts(0).Z = 0.5F
    23. verts(0).Rhw = 1
    24. verts(0).Color = System.Drawing.Color.Aqua.ToArgb()
    25. verts(1).X = 250
    26. verts(1).Y = 250
    27. verts(1).Z = 0.5F
    28. verts(1).Rhw = 1
    29. verts(1).Color = System.Drawing.Color.Aqua.ToArgb()
    30. verts(2).X = 50
    31. verts(2).Y = 250
    32. verts(2).Z = 0.5F
    33. verts(2).Rhw = 1
    34. verts(2).Color = System.Drawing.Color.Aqua.ToArgb()
    35. vb.Unlock()
    36. End Sub
    37. Private Sub Render()
    38. dev.Clear(Direct3D.ClearFlags.Target, System.Drawing.Color.Blue, 1.0F, 0)
    39. dev.BeginScene()
    40. dev.SetStreamSource(0, vbBuffer_Dreieck, 0)
    41. dev.VertexFormat = Direct3D.CustomVertex.TransformedColored.Format
    42. dev.DrawPrimitives(Direct3D.PrimitiveType.TriangleList, 0, 1)
    43. dev.EndScene()
    44. dev.Present()
    45. End Sub
    46. End Class

    Kommt folgende Fehlermeldung: "System.NullReferenceException wurde nicht behandelt.
    Message="Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
    Source="DirectX2"
    StackTrace:"
    Gelb-Markierte Zeile: "dev.Clear(Direct3D.ClearFlags.Target, System.Drawing.Color.Blue, 1.0F, 0)"
    aufjedenfall vor dem ersten Rendervorgang und sonstigem Zugriff auf die Device selbst, ansonsten ist das ansich egal...
    aber eins was sicher ist, die Render Methode in der New Methode des Formulars aufzurufen ist total hirnrissig, da die New Methode aufgerufen wird, bevor das Control sichtbar ist, somit kann man auch noch nichts anzeigen lassen...
    die Render Methode musst du selbst immer wieder neu aufrufen, entweder in einem Timer(Interval 40->25 FPS), oder in einer Endlosschleife(DoEvents nicht vergessen)...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    wir haben an seinem Code nichts verändert, du musst seinen Code kopieren und ebenfalls verändern, wie wir beschrieben haben, dass da etwas funktionieren kann...
    außerdem was geht denn wie immer nicht? DirectX SDK installiert? Verweise hinzugefügt? usw...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---