|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 04.05.2003, 19:32 Titel: Mehrere Vertexbuffer |
|
|
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 |
|
|
Ciceri Super JLI'ler
Alter: 37 Anmeldedatum: 26.08.2002 Beiträge: 418 Wohnort: Wischhafen/in der nähe Hamburgs Medaillen: Keine
|
Verfasst am: 05.05.2003, 19:12 Titel: |
|
|
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 |
|
|
Jörg JLI MVP
Anmeldedatum: 19.07.2002 Beiträge: 182 Wohnort: Siegen/NRW Medaillen: Keine
|
Verfasst am: 05.05.2003, 19:35 Titel: |
|
|
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 |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 08.05.2003, 18:56 Titel: |
|
|
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 |
|
|
Mr.X Junior JLI'ler
Anmeldedatum: 15.04.2003 Beiträge: 88
Medaillen: Keine
|
Verfasst am: 08.05.2003, 21:34 Titel: ... |
|
|
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" [/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
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 : "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 |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 08.05.2003, 23:57 Titel: |
|
|
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
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 |
|
|
|
|
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
|