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

15.04.2012, 11:10

DirectX: Viele Instanzen des gleichen Meshes rendern - wie?

Guten Morgen,

Ich entwickel gerade an einem DirectX-Projekt und bin dabei auf ein Problem gestoßen, für das mir keine Lösung einfällt und ich auch bei diversen Suchmaschinen nichts gefunden habe. Vermutlich habe ich nach den falschen Begriffen gesucht, da meine Fragestellung sicher schon Hunderte / Tausende vor mir hatten. :)

Ich habe ein Mesh aus einer *.x-Datei geladen und render es grob mit folgenden Aufrufen (Render-Funktion in meiner Mesh-Klasse):

C-/C++-Quelltext

1
2
3
4
5
for(DWORD i=0; i<this->dwNumMaterials; i++)
{Device->SetMaterial(&this->lpMeshMaterials[i]);
    Device->SetTexture(0, this->lpMeshTextures[i]);
    this->lpMesh->DrawSubset(i);
}



Nun möchte ich dieses Mesh sehr oft darstellen, nur an verschiedenen Positionen. Dazu habe ich mir eine zweite Klasse geschrieben, die einen Szene-Graphen implementiert und an jedem Knoten des Graphen eine Referenz auf ein Mesh hat. Wenn ich in meiner Haupt-Render-Funktion den Szene-Graphen rendern möchte, wird für jede Mesh-Referenz die jeweilige Render-Funktion aufgerufen.

Das funktioniert auch wunderbar, ist aber grausam langsam. Meine Frage ist nun, wie das schneller geht? Angenommen ich habe ein Baum als X-Modell geladen und möchte nun 10.000 Bäume rendern, dann müsste ich doch die ganzen Render-Informationen nur ein Mal auf die Grafikkarte packen und 10.000 mal transformieren, oder? In OpenGL gibt es dafür die Display-Lists, aber wie geht das in DirectX?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

15.04.2012, 11:20

Schau mal hier nach: Instancing
@D13_Dreinig

3

15.04.2012, 14:10

Funktioniert das auch für Meshes? Wenn ich die Meshes habe, render ich doch üblicherweise mit dem Code-Schnipsel, das ich oben gezeigt habe, oder?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

15.04.2012, 14:15

Genau dafür ist Instancing gedacht.
@D13_Dreinig

5

15.04.2012, 18:50

Ich stehe auf dem Schlauch. Ich habe doch bei den Meshes keinen Zugriff auf die Vertizes, wie bei "handgemachten" Modellen, oder?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

15.04.2012, 19:13

Ich stehe auf dem Schlauch. Ich habe doch bei den Meshes keinen Zugriff auf die Vertizes, wie bei "handgemachten" Modellen, oder?


Mesh bezeichnet üblicherweise nur die Geometrie eines Objekts.
@D13_Dreinig

7

15.04.2012, 20:08

Ja, aber da wir in DirectX sind, sprach ich von den LPD3DXMESH.

FSA

Community-Fossil

  • Private Nachricht senden

8

15.04.2012, 20:43

Kann man nicht einfach die Weltmatrix mehrfach setzten und immer Render aufrufen? Oder liege ich da falsch?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

15.04.2012, 21:12

Klar geht das, ist aber langsam.
Hier ist die Rede von Instancing.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

15.04.2012, 22:04

Ja, aber da wir in DirectX sind, sprach ich von den LPD3DXMESH.


Wenn man sich im Kontext DirectX bewegt, impliziert dies natürlich nicht gleich ein LPD3DXMESH wenn von einem so abstrakten Begriff wie Mesh die rede ist! Es ist natürlich auch mit DirectX problemlos möglich Meshdaten in jeder beliebigen Form zu hinterlegen. Da DrawSubset intern einen DrawIndexedPrimitive Aufruf zum absetzen des Drawcalls nutzt, genügt der Ansatzpunkt natürlich nicht der Voraussetzung. Aber DirectX ist schließlich flexibel genug!
@D13_Dreinig

Werbeanzeige