Heraus Vertexpunkten des Indexbuffers herausfinden wie viele Polygone verwendet werden
-
Hallo!
Da ich es in meinem letzten Thread sehr undeutlich beschrieben habe, möchte ich hier ein abgewandeltes Thema ansprechen. Wie einige von euch wissen schreibe ich mir ein eigenes Modelformat. Hier speichere ich bei jedem Vertex direkt seine MaterialID, somit weiß ich, welche Textur und welches Material er bekommt! Angenommen ich habe ein Haus mit 5 Materials möchte ich das wie folgt realisieren:Ich weiß ja welche Vertizen mit welchen anderen verbunden sind und ein Face bilden (aufgrund der ID). Somit kann ich für jedes Face einen eigenen Indexbuffer erstellen und diese dann mit dem Gesamtvertexbuffer rendern. Das mache ich für jedes Face. Jedoch brauche ich für das Rendern jedes Faces die Anzahl der Vertizen und der Polygone. Die Anzahl der Vertizen ist ja kein Problem (da ich durch die ID weiß, welche und wie viele Vertizen zum Face gehören). Jedoch weiß ich aus der Anzahl der Vertizen des Faces nicht wie viele Polygone das Face bilden soll. Gibt es eine Möglichkeit das rauszufinden oder eine wie ich das beim Schreiben der Modeldatei abspeicher und aus dem Mesh (da es ein .X -> meins Konvertierer ist) auslese?
Ich hoffe ihr konntet mir folgen (bin bissl sauer weil ich vorher den ganzen Text schon geschrieben habe und ich ihn nicht abschicken konnte => alles umsonst geschrieben).
Wäre super wenn ihr eine Lösung wüsstet.
Kevin
-
öhm, meinst du das ?
Bei D3DPT_TRIANGLELIST:
AnzahlPolygone /*Primitives*/ = AnzahlVertices / 3 ;
Bei D3DPT_TRIANGLESTRIP:
AnzahlPolygone /*Primitives*/ = AnzahlVertices - 2 ;
Bei D3DPT_TRIANGLEFAN:
AnzahlPolygone /*Primitives*/ = AnzahlVertices - 2 ;
-
Ja genau, danke
Leider habe ich jetzt ein neues Problem. Ich habe ja gesagt dass ich für jedes Material einen eigenen Indexbuffer erstelle, damit ich jedes Material einzeln rendern kann. Den Vertexbuffer lass ich gleich. Beim rendern des Materials "sag" ich dann er soll den KOMPLETTEN vertexbuffer verwenden und nur den Indexbuffer für das spezielle Material. Bei einem Objekt von mehr als 500 Materialien ist das jedoch extremst performancelastig.
Das DrawPrimitive zieht an der Performance. Ich denke das liegt daran, weil ich bei der Anzahl der Ecken ALLE im GESAMTEN Objekt vorhandenen Ecken verwende. Wenn ich nur die für das Material hernehme stürzt das Programm leider ab. Wie würdet ihr das machen?
Also dieser Code zum Malen eines Materials wäre dieser:
dd_obj.lpD3DDevice->SetIndices(D3D_SubsetBuffers[ID], 0); dd_obj.lpD3DDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, _header.iVertizes, 0, iPolygons[ID]);
Also ich wähle erst den erstellten Indexbuffer für das Subset aus und male es dann, jedoch bei Ecken die Anzahl aller Ecken im Objekt. Sollte ich mir vielleicht für jedes Material auch noch einen eigenen Vertexbuffer erstellen?
Kevin
-
Nein, ist schon besser so, wie du es jetzt machst.
Du setzt einmal den gesamten VrertexBuffer für dein Objekt und gehst dann alle Faces durch, und setzt den/die/das jeweiligen/e IndexBuffer/Textur/Material (:D)
Wenn du den gesamten VertexBuffer bisher bei jedem Face mit SetStreamsSource neu gesetzt hast, dann war das überflüssig. Setz ihn nur einmal.
-
Ich musste dann immer die kompletten Vertizen angeben. Also wie viele Vertizen es sind. Das ging zu sehr auf die Performance. Jetzt habe ich für jedes Face einen eigenen Vertex und Indexbuffer, Performance ist auch gut so.
-
Was soll denn das mit den hunderten Index-Buffern?
Ein einzelner reicht doch, da passen doch alle Faces rein, solange Du nicht über 2^24 Indizes verwenden willst (das ist die Grenze der meisten Grafikkarten).
Man kann Deine Fortschritte übrigens sehr schön hier im Forum verfolgen, wenn man sich all die Threads anguckt
-
Aber wie soll ein Indexbuffer reichen? Ich muss doch vor jedem Face sagen welche Textur und welches Material verwendet werden soll. Und da ich über DrawIndexedPrimitive die Faces zeichne brauche ich doch mehrere Indexbuffer. Mehrere Vertexbuffer brauche ich nur aufgrund der Performance, da ich sonst beim Rendern bei der Anzahl der Vertizen immer das Maximale angeben muss, was nicht wirklich an er Performance spart
Ich mache Fortschritte?
-
Surkevin schrieb:
Aber wie soll ein Indexbuffer reichen?
Ganz einfach! Du merkst Dir, wo die Indizes für jedes Material beginnen. Wozu gibt es denn wohl den Parameter "StartIndex" bei DrawIndexedPrimitive? Und wenn Du die Vertizes im Vertex-Buffer clever anordnest, musst Du auch nicht auf mehrere Buffer zurückgreifen. Jedes Wechseln kostet Zeit.
-
Hey das ist doch mal ne Idee! GUT dass ich mir die Funktion DrawIndexedPrimitive so genau angeguckt hab
Danke dir *küss*
Ich hoffe das dicke S hinter Vertizes ist keine Anspielung *g*
Jetzt brauche ich nur noch eine Lösung für das Problem vom Konvertieren von .X -> meins.
Wenn die super D3DXLoadMesh funktionen große Dateien nicht wirklich laden können habe ich ein Problem
Dann muss ich mir wohl ein anderes ModelFormat raussuchen, welches von ModelProgrammen (milkshape oder 3dsm) unterstützt wird, welches ich dann konvertiere.
Oder was meinst du/ihr?
Kevin
-
TomasRiker schrieb:
Surkevin schrieb:
Aber wie soll ein Indexbuffer reichen?
Ganz einfach! Du merkst Dir, wo die Indizes für jedes Material beginnen. Wozu gibt es denn wohl den Parameter "StartIndex" bei DrawIndexedPrimitive? Und wenn Du die Vertizes im Vertex-Buffer clever anordnest, musst Du auch nicht auf mehrere Buffer zurückgreifen. Jedes Wechseln kostet Zeit.
Nur zu sagen an welcher Stelle des Indexbuffers das Material anfängt reicht nicht. Komisch.
-
Nicht? Bei mir schon!
-
Mann muss auch sagen, wo's aufhört?
-
Das muss man doch sowieso.
Theoretisch wäre es aber garnicht nötig, denn normalerweise hört es da auf, wo das nächste anfängt, oder wenn es das letzte ist, da, wo der Index-Buffer zu Ende ist.
-
TomasRiker schrieb:
Das muss man doch sowieso.
Theoretisch wäre es aber garnicht nötig, denn normalerweise hört es da auf, wo das nächste anfängt, oder wenn es das letzte ist, da, wo der Index-Buffer zu Ende ist.Ist mir klar, nur Kevin auch?
-
Hallo!
Ich hab da ein Problem mit. Es reicht nicht wenn ich nur sage bei welcher IndexID er anfängt, ich muss dazu noch sagen bei welchem Vertex. Also mit dem Parameter MinVertex. Da gibt es nur Probleme. Der malt die ersten 2 Materialobjekte richtig, danach nur sehr komisch. Ich habe folgende Parameter übergeben:1: D3DPT_TRIANGLELIST
2: Die Position des ersten Vertex(es) im Vertexbuffer des zu malenden Materialobjektes
3: Wie viele Vertizen das Material besitzt
4: Die Position des ersten Vertex(es) im Indexbuffer des zu malenden Materialobjektes
5: Die Anzahl der zu malenden Polygonemach ich da irgendwas bei falsch?
Kevin
-
Als benutzte Vertizen kannst du eigentlich alle angeben. Da du ja ehh das ganze Objekt zeichnest (zwar in mehreren Aufrufen), sollte das nicht schlecht für die Performance sein.
-
oh doch, ist es. Das macht einen enormen Performanceunterschied bei extremhigh polygonen aus. Als ich mein Rießenmodel in sehr viele Vertex/Indexbuffer aufgeteilt habe lief alles flüssig. Davor als ich nur einen zur Verfügung hatte und bei jedem Aufruf alle Vertizen angegeben habe ruckelte es ohne Ende. Von daher...
-
Ist natürlich jetzt die Frage, wie gross der Buffer war, wie genau er angelegt war und was evtl. sonst noch anders war. Es gibt IMHO eine "ideale" Grösse für statische VBs die aber über normalen Models lag.