Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

  • »CoookeiMonssterr« ist der Autor dieses Themas

Beiträge: 25

Wohnort: Schweiz

Beruf: Informatik-Lehrling

  • Private Nachricht senden

11

08.12.2014, 14:48

Vielen Dank für die Tipps.

Habe dazu leider noch ne Frage zur Mesh-Klasse:

Wenn du schreibt, dass sie einen VertexBuffer und einen IndexBuffer kombiniert. Meinst du damit einen richtigen VertexBuffer oder einfach nur Vertexies in einem Container (std::vector<VERTEX>)?

Vielen Dank für die Empfehlungen. Da ich noch ziemlich am Anfang bin, helfen die mir sehr... Hat sonst noch jemand gerade ein paar Tipps/Empfehlungen für mich? 8o

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

12

08.12.2014, 14:56

Ein Vertexbuffer ist normal nur eine Datenstruktur die Vertizes hält. Also ja.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

13

08.12.2014, 17:21

Nein. Ein VertexBuffer ist ein Rudel Daten im Speicher der Grafikkarte. Ein std::vector<> dagegen ist ein Rudel Daten im Speicher des Zentralprozessors. Damit Du rendern kannst, muss alles im Speicher der Grafikkarte liegen. Das schließt Vertexdaten, Indexdaten, Texturen, Shaderkonstanten, Shader, Vertexdeklarationen usw. ein. Das alles sollte man nur so oft anlegen wie nötig, in den allermeisten Fällen also einmalig am Anfang des Spiels oder beim Laden des Levels.

Dinge wie Partikelvertizes, die Vertizes der Buchstaben des Bildschirmtextes, HUD-Grafiken usw. werden üblicherweise jedes Frame neu zusammengestellt und hochgeladen. Dafür gibt es VertexBuffer mit Usage DYNAMIC, die man mit weniger Overhead neu befüllen kann. Ansonsten bleibt alles gleich.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

  • »CoookeiMonssterr« ist der Autor dieses Themas

Beiträge: 25

Wohnort: Schweiz

Beruf: Informatik-Lehrling

  • Private Nachricht senden

14

09.12.2014, 08:45

Hmm.. Inwiefern kann ein Objekt speicher in der Grafikkarte belegen? Werden diese Vertizes (In einem std::vector<?>(Datenstruktur)) nicht in dem Objekt gespeichert und dann in den Vertexbuffer geladen?

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

15

09.12.2014, 09:28

Nein, der std::vector ist in deinem normalen RAM. Der Vertexbuffer belegt speichert im RAM der Grafikkarte. Meistens zumindestens, aber das sind Details um die sich der Treiber des Herstellers schon kümmert.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

16

09.12.2014, 14:38

Du erstellst einen VertexBuffer. Mit CreateBuffer() oder wie das Ding heißt. Ab diesem Aufruf hast Du ein Stück Speicher in der GPU für Deine Zwecke reserviert. Was auch immer Du mit einem std::vector<> tust oder was Du in Deinem Objekt verwaltest, betrifft den GPU-Speicher nicht, solange Du es nicht explizit hochlädst. Also per Map()/Unmap() oder hier im Idealfall gleich den Buffer als Immutable mit Vorgabeinhalt anlegen.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

  • »CoookeiMonssterr« ist der Autor dieses Themas

Beiträge: 25

Wohnort: Schweiz

Beruf: Informatik-Lehrling

  • Private Nachricht senden

17

13.12.2014, 20:18

Nein. Ein VertexBuffer ist ein Rudel Daten im Speicher der Grafikkarte. Ein std::vector<> dagegen ist ein Rudel Daten im Speicher des Zentralprozessors. Damit Du rendern kannst, muss alles im Speicher der Grafikkarte liegen. Das schließt Vertexdaten, Indexdaten, Texturen, Shaderkonstanten, Shader, Vertexdeklarationen usw. ein. Das alles sollte man nur so oft anlegen wie nötig, in den allermeisten Fällen also einmalig am Anfang des Spiels oder beim Laden des Levels.

Dinge wie Partikelvertizes, die Vertizes der Buchstaben des Bildschirmtextes, HUD-Grafiken usw. werden üblicherweise jedes Frame neu zusammengestellt und hochgeladen. Dafür gibt es VertexBuffer mit Usage DYNAMIC, die man mit weniger Overhead neu befüllen kann. Ansonsten bleibt alles gleich.


Also so wie ich das jetzt verstanden habe, werden die Vertices am Anfang des Spieles während dem Ladebildschirm in den Vertexbuffer geladen und nicht jedes Frame, da dies extrem viel Leistung braucht.
Angenommen mein Objekt dreht sich im Kreis. Dann verändern sich diese Daten ja ständig und diese werden ja nicht automatisch neu in den Buffer geschrieben. Somit bleibt ja alles so wie es am Anfang war (es dreht sich nicht). Muss ich deshalb nur die Daten neu "hochladen", die sich verändert haben?

Hab ich da jetzt was falsch verstanden?

18

13.12.2014, 21:37

Für das Drehen des Objektes kannst du einfach eine Rotationsmatrix in den constant buffer des Vertex-Shaders packen und den Vertex im Shader mit dieser Matrix multiplizieren.

Also Buffer mit D3D11_BIND_CONSTANT_BUFFER und D3D11_USAGE_DYNAMIC erstellen, mit ID3D11DeviceContext::Map() updaten, Buffer im Shader deklarieren und mit VSSetConstantBuffers() den Buffer an den entsprechenden Buffer-Slot binden..
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

19

14.12.2014, 12:55

Wir waren schon weiter als das, Bambi. Bitte keine allgemeinen Weisheiten, wenn der Threadersteller noch an fundamentalen Problemen hängt.

@Keksmonster: Wenn ein Modell sich drehen soll, setzt man das im VertexShader mittels Transformationsmatrix um. Wenn die Kamera sich bewegt, bewegst Du doch auch nicht alle Vertizes aller Modelle :-)

Wie gesagt: Du hast die völlige Freiheit, was Du in den Shadern mit den Vertexdaten machen willst. Du kannst sie der Länge nach wobbeln lassen, unter einer gewissen Höhe abschneiden, Zacken rausgucken lassen oder halt rotieren. Als Standard hat sich da die World-, View- und Projection Matrix herausgebildet. Die World Matrix positioniert das Modell in der Welt. Die View Matrix positioniert und rotiert die Welt vor der Kamera, und die Projection Matrix richtet die Daten für die 3D-Darstellung der Grafikkarte auf dem Bildschirm her.

Die World Matrix setzt Du üblicherweise für jedes Modell, was Du zeichnest, neu.
Die View Matrix setzt Du einmal am Anfang des Frames.
Die Projection Matrix setzt Du einmalig und setzt sie nur neu, wenn sich die Fenstergröße ändert oder Du z.B. den Kameraöffnungswinkel ändern willst.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

  • »CoookeiMonssterr« ist der Autor dieses Themas

Beiträge: 25

Wohnort: Schweiz

Beruf: Informatik-Lehrling

  • Private Nachricht senden

20

14.12.2014, 14:50

Vielen Dank für die Antworten

Also so wie ich das jetzt verstanden habe, werden die Vertices am Anfang des Spieles während dem Ladebildschirm in den Vertexbuffer geladen und nicht mehr verändert. Diese werden dann währende dem Rendern mittels VertexShader mit den Matrizen transformiert. Und nicht verändert und dann wieder neu hochgeladen...?

Werbeanzeige