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

1

25.06.2011, 12:11

C++ mit DirectX Vertex Buffer mit 3d-Objekt unbekannter Größe

Hallo,
mein Problem ist, dass ich einen Vertexbuffer in c++ mit DirectX9 erstellen möchte, aber weder die Größe noch die einzelnen Positionen der Punkte vorher weiß. Am besten schreibe ich aber mal das konkrete Problem, ich glaube sonst kann man das nicht verstehen:
Also, ich möchte ein Terrain aus einer Datei laden und dieses dann in den Vertexbuffer packen, da die fps sonst im Keller sind. Das Problem ist jetzt, das ich halt weder Weiß, wie die einzelnen Punkte des Terrains liegen, noch wie groß das ganze überhaupt ist. Dazu lade ich erstmal die Daten aus der Datei und dass funktioniert auch ganz gut, denn wenn ich das Ganze per DrawPrimitiveUP zeichne gibt es kein Problem.
Das habe ich bis jetzt gemacht, aber leider funktioniert es ja noch nicht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
//Initialisierung
LPDIRECT3DVERTEXBUFFER9 v_buffer=NULL;
d3ddev->CreateVertexBuffer(uiTriangleCount*3*sizeof(STerrainVektor), D3DUSAGE_WRITEONLY, STerrainVektor::dwFVF, D3DPOOL_MANAGED, &v_buffer, NULL);
void *vb_vertices;
v_buffer->Lock(0,0,&vb_vertices,0);
memcpy(vb_vertices, (void*)pVertices, uiTriangleCount*3*sizeof(STerrainVektor));


//Rendern
d3ddev->SetFVF(STerrainVektor::dwFVF);
d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(STerrainVektor));
d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

uiTriangleCount enthält die Anzahl der Dreiecke.
pVertices sind die gespeicherten Punkte
d3ddev ist mein 3d-Device
Zum Vergleich noch wie ich es mit DrawPrimitiveUP mache:

C-/C++-Quelltext

1
2
3
//Rendern
d3ddev->SetFVF(STerrainVektor::dwFVF);
d3ddev->DrawPrimitiveUP(D3DPT_TRIANGLELIST, uiTriangleCount, (void*)pVertices, sizeof(STerrainVektor));

Der Rest ist bei beiden Methoden identisch geblieben, also glaube ich nicht das da der Fehler liegt.
Das Beispiel mit Vertexbuffer gibt übrigens keinen Fehler, sondern zeigt einfach nichts an (man sieht den Hintergrund)
Habe ich irgendetwas vergessen, was man beim Umwandeln von DrawPrimitiveUP zu Vertexbuffer machen muss?
Muss ich vielleicht an der Vertexliste was ändern?

Ich hoffe mein Problem ist einigermaßen verständlich.
Danke schonmal im Voraus

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

25.06.2011, 12:18

Warum kannst du das Terrain nicht laden bevor du den VertexBuffer erzeugst sodass du die Größe dann kennst!?

3

25.06.2011, 12:22

Mache ich ja, aber leider zeigt er trotzdem nichts an. Ich lade zuerst das Terrein und erzeuge dann den Vertexbuffer. Ich habe ja in
uiTriangleCount schon gespeichert, wie groß das ganze wird. Ich glaube das Problem ist, das pVertices ein dynamischer Array ist.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

25.06.2011, 12:25

Oh, du hast vergessen deinen VertexBuffer zu unlocken ;)

5

25.06.2011, 12:30

Stimmt, das hatte ich vergessen, aber das Problem ist leider immer noch nicht gelöst, immer noch nichts zu sehen. Obwohl das wirklich ein dummer Fehler war, den hätt ich wohl ewig gesucht, leider hat es nichts gebracht.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

25.06.2011, 12:32

Du zeichnest ja auch nur ein Dreieck...

7

25.06.2011, 12:37

Danke, das war das Problem, Ich hätte wohl die Beschreibung von DrawPrimitive mal ein bisschen genauer lesen sollen, das hätte mir viel erspart. Jetzt wird alles angezeigt und das ganze läuft konstant auf 60fps und nicht auf schlappen 20.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

25.06.2011, 12:38

Wenn dus noch schneller machen willst wär der nächste Schritt einen IndexBuffer einzusetzen damit du Vertices mehrfach verwenden kannst ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

25.06.2011, 15:05

Macht denn das das Rendering an sich schneller? Wenn die Daten eh schon in den Grafik-Ram übertragen wurden macht es doch keinen Unterschied mehr an FPS ob ich mit oder ohne Index arbeite, oder?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

10

25.06.2011, 15:20

Also ich weiß jetzt nicht wie das theoretisch aussieht, aber in der Praxis ist das meine ich so.
Ich hab da auch mal ein paar Tests gemacht. 1000000 Dreiecke zeichnen.
Einmal mit und einmal ohne Indexbuffer. Die Rechengeschwindigkeit hatte sich nicht verändert,
erst als ich die Daten pro Frame hochgeladen habe, da habe ich dann mit dem Indexbuffer (dynamisch) ca. 300% rausgeholt.
Wie gesagt, weiß ich nicht ob das jetzt immer der Fall ist.

Werbeanzeige