JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=a4f49b51c4a60b72c9eaddb5efda3147Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Mehrere Vertexbuffer

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 04.05.2003, 19:32    Titel: Mehrere Vertexbuffer Antworten mit Zitat

Tach, ich hab auch mal eine (drei) Frage(n) an die Direct3D-Profis...
Nutzt man, wenn man mehrere 3D-Objekte darstellen will, die sich unabhängig voneinander bewegen können für jedes Objekt einen eigenen Vertexbuffer oder werden die alle in einen Vertexbuffer gesteckt und die Transformationen dann nur auf Teile des Vertexbuffers angewendet?
Ist es sinnvoll für jede Renderung einen neuen Vertexbuffer zu verwenden, der nur Teile enthält, die potientiell sichtbar sind, sich also nicht meilenweit hinter der Sichtfläche befinden oder nutzt mann dann wieder nur den gleichen Vertexbuffer und transformiert wieder nur Teile der Szene?
Ist es möglich, aus einem (mehreren) Vertexbuffer(n) Teile in einen anderen zu kopieren, so daß man z.B. einen Gesamtvertexbuffer erstellt, auf den dann die finale Transformation (Kameraposition und Rotation) angewendet wird?

AFE-GmdG
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Ciceri
Super JLI'ler


Alter: 37
Anmeldedatum: 26.08.2002
Beiträge: 418
Wohnort: Wischhafen/in der nähe Hamburgs
Medaillen: Keine

BeitragVerfasst am: 05.05.2003, 19:12    Titel: Antworten mit Zitat

es ist glaube ich möglich vn einem Vertexbuffer in einen anderen Vertexbuffer zu kopieren. ich kann mir es vorstellen, kann sogar sein, dass hier schonmal sowas auch besprochen wurde!
ich selber würde einen hauptbuffer nehmen, das tu ich bei sound und dann würde ich nur das reinladen, was auch gerade angefordert wird, z.B. das Dreieck und Viereck sind zu sehen und der Kreis "nicht", dann wird einfach der Kreis nicht geladen. bei sound sit das wie gesagt fast genauso
hoffe dir mit meinen VERMUTUNGEN weitergeholfen zu haben.
_________________
www.z-software.de
Spieleentwicklung-Pur
Besuchen Sie uns.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jörg
JLI MVP
JLI MVP



Anmeldedatum: 19.07.2002
Beiträge: 182
Wohnort: Siegen/NRW
Medaillen: Keine

BeitragVerfasst am: 05.05.2003, 19:35    Titel: Antworten mit Zitat

Ob für mehrere Objekte ein VB oder für jedes Modell ein eigener besser geeignet ist, hängt z.B. davon ab, aus wie vielen Vertices/Dreiecken deine Modelle bestehen. Handelt es sich um viele, würde ich für jedes Modell einen eigenen benutzen, denn hinsichtlich deiner zweiten Frage ist das Locken und kopieren von großen Buffern wohl eher langsamer, als wenn du einfach den entsprechenden VB des sichtbaren Modells ins Device setzt.

Bei kleineren Modellen ist es dahingegen wohl eher angebracht, für mehrere Modelle einen VB zu nehmen und den auch pro Frame mit den sichtbaren neu zu befüllen, weil du dadurch die SetVertexBuffer()-Aufrufe reduzierst.

Zu deiner dritten Frage fällt mir nichts besseres ein, als dass du den/die Vertexbuffer lockst und die Daten dann kopierst.

Was für dich am geeignesten/schnellsten ist, musst du ausprobieren.

Interessant ist auch "Performance Optimizations" in der SDK-Doku der Abschnitt "Using Dynamic Vertex and Index Buffers".
_________________
www.messiahzone.de.vu
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 08.05.2003, 18:56    Titel: Antworten mit Zitat

Zu deiner ersten Frage kann ich nich viel sagen. Manche meinen mit einem Vertexbuffer für alles sei es am besten, manche meinen man bräuchte für jeden scheiß einen... naja, musst ausprobieren.

Zu deiner 2ten: Du kannst einfach einen VB, oder halt mehrere, haben und dann über Indexbuffer nur das rendern, was auch sichtbar ist.

man kopiert Vertexbuffer und Indexbuffer ganz einfach über "Lock" und "memcpy", allerdings musst du deinen VB solange gelockt lassen, bis du die Vertexdaten nicht mehr brauchst. Dann wieder unlocken über "unlock" natürlich...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mr.X
Junior JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 08.05.2003, 21:34    Titel: ... Antworten mit Zitat

Zitat:

Ist es sinnvoll für jede Renderung einen neuen Vertexbuffer zu verwenden, der nur Teile enthält, die potientiell sichtbar sind, sich also nicht meilenweit hinter der Sichtfläche befinden oder nutzt mann dann wieder nur den gleichen Vertexbuffer und transformiert wieder nur Teile der Szene?

Meinst Du jetzt, jedes Frame einen VB mit den passenden Vertices neu!!! erstellen? Das auf KEINEN FALL! Das Anlegen und Befüllen von VB's dauert für solch eine Technik zu lang. Schneller wäre hier sicherlich mehrere!!! Indexbuffer auf ein und denselben Vertexbuffer zu haben und je nach LOD-Level oder halt Sichtbarkeit den passenden Indexbuffer zu nehmen. Der geringe Verbrauch von Speicherplatz für Indexbuffer im Vergleich zum "langsamen" Erstellen und Befüllen von Vertexbuffern bietet dies wohl eher an. (Außer natürlich man erstellt verdammt viele Indexbuffer, da dies dann wiederum Overkill für den Grafikkartenspeicher ist, da eh immer nur einer gebraucht wird)
Meintest Du aber, aus mehreren VB's den passenden auswählen? Dann dies auch auf KEINEN FALL!!! Da mehrere VB's wesentlich mehr Speicher verbrauchen als mehrere Indexbuffer auf ein und denselben VB.
Möglich ist es also, aber eben nicht sonderlich sinnvoll weil langsamer als mit mehreren Indexbuffern!
[EDIT]Also ja, "man nutzt dann wieder nur den gleichen Vertexbuffer und transformiert wieder nur Teile der Szene" Smile [/EDIT]



Zitat:

Ist es möglich, aus einem (mehreren) Vertexbuffer(n) Teile in einen anderen zu kopieren, so daß man z.B. einen Gesamtvertexbuffer erstellt, auf den dann die finale Transformation (Kameraposition und Rotation) angewendet wird?

Ich poste hier einfach mal die FunktionsParameter Smile
Code:

HRESULT Lock(
  UINT OffsetToLock,
  UINT SizeToLock,
  BYTE** ppbData,
  DWORD Flags
);

Deine Frage bzgl. Teile eines Vertexbuffers kopieren dürften die Parameter OffsetToLock und SizeToLock beantworten.
Und bei der Frage bzgl. "aus mehreren VB's" berufe ich mich auch auf die Doku Smile : "When working with vertex buffers, you are allowed to make multiple lock calls..."



Zitat:

Nutzt man, wenn man mehrere 3D-Objekte darstellen will, die sich unabhängig voneinander bewegen können für jedes Objekt einen eigenen Vertexbuffer oder werden die alle in einen Vertexbuffer gesteckt und die Transformationen dann nur auf Teile des Vertexbuffers angewendet?

Normal nutzt man für jedes Objekt einen eigenen VB, um sich die Übersichtlichkeit zu erhalten (besonders wenn man's OO machen will).
Aber es dürfte auch keinen großen Unterschied machen, wenn man nur ein VB nutzt. Allerdings kann ich mir vorstellen das bei einem wirklich sehr großen VB das Programm wiederum langsamer wird, da er den VB da mit Sicherheit nicht linear auf dem Graka-Speicher ablegen kann und die interne Rechnerei wieder überwiegt gegenüber mehreren kleinen VB's.





Zitat:

Bei kleineren Modellen ist es dahingegen wohl eher angebracht, für mehrere Modelle einen VB zu nehmen und den auch pro Frame mit den sichtbaren neu zu befüllen, weil du dadurch die SetVertexBuffer()-Aufrufe reduzierst.

Also mehrere SetStreamSource()-Aufrufe (meinst Du bestimmt mit SetVertexBuffer()) dauern mit Sicherheit nicht so lange, wie einen VB zu locken und neu zu befüllen! Diesen Ansatz würde ich daher NICHT wählen.



mfG
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 08.05.2003, 23:57    Titel: Antworten mit Zitat

Vielen Dank für die zahlreichen Antworten. Ich habe es nun auch hinbekommen, dass ich einen Vertexbuffer für mehrere Objekte nutzen kann. Ist gar nicht so schwierig Wink
Nun muß ich mir nur noch eine gute Verwaltung der Objekte einfallen lassen, also wie ich die Leveldaten selber und die darin befindlichen Objekte am günstigsten unterbringe. Ein abgewandeltes PVS wird wohl zum einsatz kommen, da ich keine reinen InDoor-Levels habe. (Deshalb kann ich keinen BSP-Tree verwenden, der funktioniert wohl nur für geschlossene Räume)

AFE-GmdG
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum