Objektverwaltung DirectX11



  • Hallo,

    habe beruflich mit OpenGL zu tun. (OpenSG/NVSG)
    Nun möchte ich privat mir DirectX11 aneignen.
    Nun fehlt mir ein bischen der Überblick.
    Trotz einem DX10 Buch.. und den Tutorials.
    Diese sind ziemlich "zusammen geklatscht.." programmiert

    Möchte eine Direct3D Application erstellen, in der sich sehr viele
    Szenen Objekte befinden. Diese Objekte können nach belieben gelöscht oder weitere hinzugefügt werden. Die Geometrie ist statisch.
    Jedes Objekt hat eine Farbe. Objekte müssen auch pickbar sein. Das ganze sollte sehr performant sein.

    - Was für fertige Konstrukte für solche SzenenObjekte gibt es bei DX?

    - Ist es sinnvoll für jedes "SzenenObjekt" einen Vertex Buffer anzulegen?

    - Ist es besser einen großen Buffer zu initialisieren, der alle Objekte enthält evtl. nach farben sortiert?

    - wie kann ich anhand eines großen Buffer erkennen welches Objekt(id)
    gepickt wurde?

    - Gibt es einen SzenenManager in DX ?

    - Gibt es fertige Geometrie Knoten Klassen?

    - Wie läuft das Rendering der einzelnen Objekte ab?

    Vielen Dank!!!



  • matthiasas schrieb:

    Möchte eine Direct3D Application erstellen, in der sich sehr viele
    Szenen Objekte befinden. Diese Objekte können nach belieben gelöscht oder weitere hinzugefügt werden. Die Geometrie ist statisch.
    Jedes Objekt hat eine Farbe. Objekte müssen auch pickbar sein. Das ganze sollte sehr performant sein.

    Ich glaub du hast da ein bisschen eine falsche Idee davon, was Direct3D ist. Direct3D ist eine low-level Grafik API. Direct3D ist nichts anderes als eine sehr dünne Schicht über die du Befehle direkt an den Grafiktreiber schicken kannst. Direct3D tut also im Prinzip nichts anderes als der Grafikkarte sagen, wo genau sie wieviele Dreiecke hinmalen soll und das wars. Konzepte wie "Objekte" oder "Knoten" sind weiiit über der Ebene angesiedelt, auf der Direct3D arbeitet.

    matthiasas schrieb:

    - Was für fertige Konstrukte für solche SzenenObjekte gibt es bei DX?

    Keine

    matthiasas schrieb:

    - Ist es sinnvoll für jedes "SzenenObjekt" einen Vertex Buffer anzulegen?

    Hängt davon ab, kann man allgemein nicht sagen.

    matthiasas schrieb:

    - Ist es besser einen großen Buffer zu initialisieren, der alle Objekte enthält evtl. nach farben sortiert?

    Hängt davon ab, kann man allgemein nicht sagen.

    matthiasas schrieb:

    - wie kann ich anhand eines großen Buffer erkennen welches Objekt(id)
    gepickt wurde?

    Gibt's mehrere Möglichkeiten. Aber egal wie du's machst; es läuft darauf hinaus, dass du es selbst machen musst. Da D3D keine Ahnung davon hat was genau ein "Objekt" sein soll, hat es natürlich erst recht keine Ahnung davon was "Picking" sein soll.
    Auch ist es eine reine low-level Grafik API, es weiß also insbesondere auch nichts von einer "Maus" oder sonst irgendwelchen "Eingabegeräten".
    Üblicherweise wird Picking so implementiert, dass man eben die entsprechenden Dreiecke irgendwo in einer entsprechenden Datenstruktur (evtl. Octree oder sonstwas) im RAM liegen hat, sich einen Strahl berechnet der von der Maus in die Szene ragt und dann auf der CPU den Strahl in die Datenstruktur schickt, Schnittpunkte berechnet und so am Ende eben rausfindet ob ein Dreieck getroffen wurde und wenn ja welches Dreieck von welchem Objekt. Direct3D kommt dabei also in der Regel gar nicht erst ins Spiel. Wenn du das implementieren willst, dann also auf der Ebene von Additionen, Multiplikationen, Divisionen ...

    matthiasas schrieb:

    - Gibt es einen SzenenManager in DX ?

    Nein

    matthiasas schrieb:

    - Gibt es fertige Geometrie Knoten Klassen?

    Nein. Direct3D ist kein Szenengraph. OpenGL übrigens auch nicht.
    Vielleicht ein etwas bildhafterer Vergleich: Wenn OpenSG eine ganz bestimmte Art von Suppe ist, dann ist Direct3D/OpenGL die Erde auf der man alle möglichen Zutaten anbauen kann. Wenn du deine Suppe kochen willst, musst du also erstmal die Samen für deine Zutaten sammeln, aussäen, gießen... Während die Zutaten wachsen, hast du Zeit, das Feuer zu entdecken und Kräuter zu sammeln, kochen zu lernen und das Rezept zu studieren, bis es Zeit zur Ernte ist. Evtl. wird auch ein kurzer Abstecher in den Salzbergbau ö.ä. nötig bis du Wasser aufsetzen und mit der Zubereitung beginnen kannst. Nachdem du die erste Suppe versalzen und den ganzen Prozess wiederholt hast, wirst du es beim zweiten Mal schon etwas besser machen. Natürlich gibt es heutzutage auch für praktisch jeden Zwischenschritt bereits fertige Lösungen, wie z.B. Elektrizität und eine Induktionskochplatte, derer du dich bedienen kannst. Und du wirst mit der Zeit auch von selbst das Obsidianmesser ablegen und immer bessere Werkzeuge entwickeln, die beispielsweise die Landwirtschaft deutlich erleichtern und die Erträge vervielfachen.

    matthiasas schrieb:

    - Wie läuft das Rendering der einzelnen Objekte ab?

    So wie du es programmierst 😉

    Ich will dir damit jetzt auf keinen Fall Angst machen oder dir den Mut nehmen. Direct3D zu lernen ist imo eine sehr lohnenswerte Sache. Ich will damit nur sagen: Geh es langsam an, es ist wohl was völlig anderes als du erwartest.
    Ich würde dir raten, einfach mal nur ein einzelnes Dreieck mit Direct3D zu malen. Und dann einen rotierenden Würfel. Danach wirst du eine ungefähre Vorstellung davon haben, was Direct3D eigentlich ist und wie es funktioniert. Lass dich dabei einfach nicht entmutigen, auch wenn am Anfang alles unglaublich kompliziert wirkt (vor allem Diretc3D 11 hat eine sehr steile Lernkurve), so kompliziert wie es scheint ist es am Ende gar nicht 😉



  • OK, dann frag ich mal so, ist die Klasse ID3DX10Mesh
    dazu geeignet, sie als "Geometrie Knoten" herzunehmen?



  • matthiasas schrieb:

    Ich dachte da Direct3D objektorientiert ist, gibt es evtl. schon ein Object Management System.

    Nein, Direct3D ist die selbe Ebene wie OpenGL. OpenGL ist übrigens auch objektorientiert, wenn auch auf eine sehr...merkwürdige...Art und Weise.

    matthiasas schrieb:

    Rentiert es sich in DirectX einen Szenengraphen einzubauen?

    Hängt davon ab was genau du erreichen willst, es ist jetzt ganz und gar nicht so, dass ein Szenengraph irgendwie das Non-plus-ultra für alle möglichen Anwendungen wäre. Vor allem wenn es um rohe Performance geht, sind vollwertige Szenengraphsysteme wie ich sie kenne (Coin/Open Inventor, OpenSG bzw. OSG, ich weiß da nie welches jetzt welches ist) normalerweise eher nicht so der Brüller...

    matthiasas schrieb:

    Was für Methoden gibt es, viele Objekte anzulegen und diese zu rendern.

    In etwa so viele, wie die menschliche Vorstellungskraft erlaubt 😉
    Um eine gute Lösung für deine konkrete Anwendung zu finden, muss man erstmal deine konkrete Anwendung kennen.

    matthiasas schrieb:

    habe von der Klasse oder dem Struct ID3DX10 Mesh gehlesen.
    Wenn ich z.b. mehrere Meshes kopieren möchte, muss ich diese kopieren oder
    kann ich auch darauf referenzieren "multiparenting"?

    Ich würde dir raten, deine eigenen Klassen zu implementieren.

    matthiasas schrieb:

    Können mehrere kopierte Meshes mit anderer Position
    auf den gleichen Index im großen VertexObjectBuffer zeigen,
    damit Vertices nicht redundant darin auftauchen?

    Also irgendwann ging das afaik mal über eine Clone-Methode oder so. Aber ich hab (wie wohl so ziemlich jeder der nicht gerade Demos für das DX SDK geschrieben hat) den D3DX Kram schon damals, wo es zumindest der Jahreszahl nach noch einigermaßen aktuell war, nie verwendet...wie gesagt: Vergiss D3DX, schreib dir deine eigene Mesh Klasse, soviel Aufwand ist das nicht und du kannst die dann direkt an deine Anforderungen anpassen.

    matthiasas schrieb:

    Gibt es fertige Strukturen für Direct3D - ähnlich wie die SGs bei OGL?

    Naja, es gibt natürlich alle möglichen Engines etc. Richtige Szenegraphsysteme die rein auf Direct3D setzen kenn ich jetzt selbst keine, gibt es aber wohl auch irgendwo. In den Bereichen wo die populär sind, ist OpenGL wohl viel weiter verbreitet.

    Beschreib einfach mal etwas genauer an was für eine Anwendung du da denkst. Um was für Szenen und Objekte handelt es sich da konkret?
    Wenn es dir um's Erlernen von Direct3D geht, wirst du aber prinzipiell eher nicht viel davon habe, wenn du erst wieder irgendwelche fertigen Strukturen verwendest. Wenn es dir darum geht, möglichst schnell und einfach irgendeine bestimmte Anwendung zu realisieren, dann wird es natürlich sinnvoll sein irgendeine Engine/Bibliothek zu verwenden. In dem Fall wär allerdings interessant zu wissen, inwiefern die dir bekannten Lösungen für deine Anwendung unzureichend sind und wie genau deine Anforderungen aussehen.



  • Danke für deine ausführlich Antwort.
    Was mich nun etwas verwundert ist dein Zitat:

    Vergiss D3DX, schreib dir deine eigene Mesh Klasse, soviel Aufwand ist das nicht und du kannst die dann direkt deine Anforderungen anpassen.

    Wie gesagt bin neu im Gebiet DX und kann noch nicht beurteilen ob die Klasse sinnvoll oder nicht ist. Ich weis auch noch nicht was gemacht werden muss dass das Programm performant wird. auf was man bei DX achten muss und
    was man dabei Falsch machen kann.

    Erst mal ein Test programm schreiben 😉



  • matthiasas schrieb:

    Ich weis auch noch nicht was gemacht werden muss dass das Programm performant wird. auf was man bei DX achten muss und was man dabei Falsch machen kann.

    Das ist eine Frage, die man sich am besten durch eifriges Studieren, jahrelange Erfahrung und ausführliches Experimentieren und Profilen selbst beantwortet 😉

    matthiasas schrieb:

    Erst mal ein Test programm schreiben 😉

    Gute Idee. VertexBuffer hast du ja schon kennengelernt und wie du damit Dreiecke malst weißt du auch. Mehr gibt es eigentlich eh kaum zu wissen um mal eine Mesh-Klasse zu bauen. Du schreibst eben die Dreiecke deines Mesh in einen VertexBuffer, packst das alles in eine Klasse und verpasst ihr eine Methode die das Ding rendert. Fürs Erste wars das dann auch schon.
    Machs einfach mal; im schlechtesten Fall wars eine gute Übung 😉



  • Gute Idee. VertexBuffer hast du ja schon kennengelernt und wie du damit Dreiecke malst weißt du auch. Mehr gibt es eigentlich eh kaum zu wissen um mal eine Mesh-Klasse zu bauen. Du schreibst eben die Dreiecke deines Mesh in einen VertexBuffer, packst das alles in eine Klasse und verpasst ihr eine Methode die das Ding rendert. Fürs Erste wars das dann auch schon.
    Machs einfach mal; im schlechtesten Fall wars eine gute Übung

    Genau diesen Weg möchte ich eig. nicht einschlagen. Im OSG war meine Verwaltung ähnlich. Jedes SzenenObjekt hatte sein eigenes Vertex Array, sein eigenes Material usw.. Bei 3500 Objekten und jeweils einem Vertexarray mit ca. 1000 Vertices und verschiedenen Farben pro Objekt ging die Framerate drastisch in den Keller.

    Ich möchte das Rendering meines Programmes verbessern.
    Evtl ein großes VertexBufferObject und dann darauf hin referenzieren.
    Objekte gleicher Fabre zuerst rendern. ect.
    Hab dich in ICQ geadded vielleicht schaust du mal rein,
    dann erklär ich dir näheres.


Anmelden zum Antworten