Direct3D rendert Triangle nicht wirklich



  • Was genau ist PIX?Ein Debugger Tool?Kann das im Inet nicht finden



  • Ein Debugging Tool, ist beim DirectX SDK dabei...



  • Hallo,
    ich würde einfach mal ganz stumpf versuchen, die Renderstates D3DRS_FILLMODE auf D3DFILL_SOLID und vielleicht auch noch bei D3DRS_SHADEMODE was zu ändern, sollte sich dort etwas schon vorher verändert haben.



  • Ok hab das Problem gestern noch gelöst ,es hab einen Fehler bei dem Shader.

    Da ich jetzt kein neuen Thread aufmachen will ,frag ich einfach mal noch was.

    Ich mach gerade eine Mesh Klasse ,wo man ein OBJ Model laden kann.
    Und zwar hab ich eine Sache etwas von einer anderen Engine abgeguckt.

    Für jedes Model ,bzw die verschiedenen Texturen gibt es eine .mat Datei ,wo dan die zwei Shader eingebunden werden,z.B Diffuse Shader und jewals für texture0,texture1... die Texturen higeschrieben.

    Damit kann man für jede Textur verschiedene Effecte leicht wählen.

    Mein Gedanke ist jetzt ,das jedes Model,also die Klasse, einen Vertexbuffer hat,und die 2 Shader/ein paar weiter sachen dafür.Diese werden beim Erstellen in ein Dynamisches Array geschrieben und dan wird das Array beim Render durchgegangen und alle Vertexbuffer der Modele mitsammt der Shader... gerendert.

    Wäre das sinnvoll,oder macht man das anders?
    Ich hab nähmlich gehört ,dass man nur einen Vertexbuffer hat und dan für die verschiedenen modele jewals immer in bestimmten bereichen die Shader...setzt,z.B Vertex 0 - 2000 Texture 1 2001 - 4000 Texture 2 ....

    Danke



  • Geht beides. Grundsätzlich ist ein Vertexbuffer pro Model aber sinnvoll.

    EDIT: Ich bin mir grad nicht sicher was genau du als "Model" bezeichnest. Natürlich kann ein Model aus mehreren Teilen mit verschiedenen Texturen bestehen...



  • Ich glaube du beziehst dich auf den zweiten Vorschlag?

    Wenn ja dann:

    Man hat einen Vertexbuffer.Jetzt gibt man aber jedem Object einen bestimmten Teil des Vertexbuffers wie z.B

    Dem Object ist einfach ein start und end index zugewiesen.Dan hat man sowas wie:
    Mesh 1 Vertexbufferstart = 0 Vertexbufferend = 4000 (also die ersten 4000 Vertices sind dem Mesh 1 zugewiesen)

    Mesh 2 " = 4001 " = 6000 (Mesh 2 hat die nächsten 2000 Vertices usw.)



  • Mir ist schon klar wie das funktioniert 😉

    Was mir nicht ganz klar ist, ist was genau du jetzt vorhast. Willst du für die ganze Szene nur einen riesigen Vertexbuffer verwenden?
    Was genau verstehst du dabei unter einem "Object", einem "Mesh" und einem "Model"?



  • Wie genau erzeugt man so ein dynamisches Array ,was man immer erweitern kann?

    Ich muss ja ,wenn ein Model geladen wir den Vertexbuffer zum array hinzufügen und beim rendern mit einer for schleife alle einträge rendern.

    Wie geht das?



  • VertexBuffer haben eine fixe Größe, die kann man nachträglich nichtmehr ändern. Du kannst nur einen neuen VertexBuffer machen.



  • http://www.cplusplus.com/reference/clibrary/cstdlib/malloc/

    ich glaube du musst da mal reinschauen 😉



  • Mal rein prinzipiell:

    Bob Wolfskin schrieb:

    Wie genau erzeugt man so ein dynamisches Array ,was man immer erweitern kann?

    Wenn du dich noch mit solchen Fragen rumschlagen musst, dann ist Direct3D eindeutig noch lange nichts mit dem du dich befassen solltest. Lern besser erstmal deine Programmiersprache zu beherrschen.



  • ....Ich meinte eigendlich was anderes.Ich weiß wie man ein dynamisches Arry erstellt ,aber nicht wie man es erweitern.

    Wenn ich z.B sowas habe:

    int NumBuffers = 0;
         ID3D11Buffer* Buffers = new ID3D11Buffer;
    
         void Add(ID3D11Buffer* buffer)
         {
            strcpy(buffer,Buffers); //kann man das so machen  ?
            NumBuffers++;
         }
    

    Ich würde dann immer einen neuen Vertexbuffer hinzufügen und durch den Integer NumBuffers beim rendern dan in der forschleife durchgehen und mit sizeof(ID3D11Buffer) die einzelnen buffer wieder rausfischen.



  • Sry das ich nochmal schreibe.Mir ist gerade aufgefallen ,dass ich den falschen Befehl meinte.Ich meine statt dem strcpy memcpy,da strcpy nur char's kopiert.



  • Bau doch deine Vertices zuerst im Speicher auf und pack sie dann alle auf einmal in einen Buffer. Dann weißt du auch wie groß der sein muss...



  • Das Problem bei sowas ist,dass ich für verschiedene Bereiche eines Models ja auch verschiedene Shader mit den entsprechenden Texturen habe,und wenn alles in einem Buffer ist ,kann ich das nichtm hr trennen.

    Ich frag mich man das macht mit so einer "Render List" ,oder wie man geladene Objekte alle rendern kann.



  • Ich versteh dein Problem leider nicht. Zuerst ist es einer der beiden Lösungswege die du nennst, irgendwie alles in einem Buffer zu haben und nun ist genau das auf einmal ein Problem!? Was meinst du mit "nicht trennen können"!?



  • Ich hab das in dem Buch Spieleprogrammierung mit DirectX9 und C++ gesehen.
    Da hat er alles in den Globaln Vertexbuffer gesteckt und in der Modelklasse den Start und End Vertex gespeichert.

    Jetzt nimmt man bei rendern folgendes;
    Model 1 geladen,belegt Vertex 0 - 200 im globalen Vertexbuffer
    Model 2 geladen,belegt Vertex 201 - 400 im globalen Vertexbuffer

    Beim rendern werden die ersten 200 Vertices vom ersten Model genommen,die entsprechenden Texturen ,Shader gesetzt ,gerendert und dan die nächsten 200 vom zweiten Model.

    Aber in DirectX 11 kann man bei rendern keinen Start und End Vertex angeben,sodass es garnicht gehen wird,die Modele von einnandern zu trennen.



  • Bob Wolfskin schrieb:

    Aber in DirectX 11 kann man bei rendern keinen Start und End Vertex angeben,sodass es garnicht gehen wird,die Modele von einnandern zu trennen.

    Was genau verleitet dich zu der Annahme, dass man das nicht kann? Schau dir doch mal bitte an was die zwei Parameter von ID3D11DeviceContext::Draw() genau sind...



  • Ohhhhhh das hab ich übersehen 😃

    Muss dan später mal nachgucken wie der das im buch gemacht hat..
    Danke


Anmelden zum Antworten