Einzelnen Beitrag anzeigen

OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#7

Re: DirectX Vertex Darstellung

  Alt 2. Sep 2003, 17:35
Ein Stern stellt einen Punkt dar?
Nimmst du Point Sprites, oder arbeitest du direkt auf dem Backbuffer?

Ich glaube in DOS war eine Menge anders als unter Windows und mit Direct3D ;c)

---

IMMER (egal wie groß) ein Viereck mit Textur erstellen. In einem anderen Thread (der war auch von dir, glaube ich (c; ) habe ich auf Tutorials auf gamedev.net hingewiesen, diese passen hier auch. Genau das empfehle ich auch: Nimm eine Textur, die einen oder mehrere Sterne enthält und rendere ein Viereck für jeden Stern.

Du brauchst dann nur vier Vertices im Vertexbuffer.
Diese bekommen Standardkoordinaten (z.B. (-1,-1;1,-1;-1,1;1,1)), die du mit Transformationsmatrizen auf das entsprechende Format bringst und auch an die richtige Stelle. Du nimmst auch Standardtexturkoordinaten (von 0,0 bis 1,1) und transformierst diese per Texturtransformationsmatrix so hin, dass der richtige Ausschnitt aus der Textur genommen wird.

Das hat nämlich einen Vorteil: Die Grafikkarte übernimmt den Löwenanteil der Arbeit. Zum Beispiel muss die CPU pro Stern jeweils zwei Matrizen berechnen, während die Grafikkarte dies pro Vertex machen muss (also acht). Mit Mipmapping wird auch der Rasterizer nicht mehr ganz so stark gefordert (stell's z.B. auf bilineare Filterung).

In Direct3D ist seit Version 8 eigentlich eine direkte Manipulation des Backbuffers nicht mehr vorgesehen.

---

Du musst bei einem Device Lost nur Objekte zerstören, die sich nicht im Managed Pool befinden. Wenn du so vorgehst, wie ich oben beschrieben habe, können sowohl der Vertexbuffer als auch die Textur im Managed Pool liegen. Wenn du weiterhin den Vertexbuffer ständig verändern willst, musst du ihn in den Default Pool schieben und ihm Dynamic Usage zuweisen. In dem Fall musst du ihn tatsächlich zerstören, dann das Device resetten und den Buffer neu erzeugen und füllen. Die Textur kann trotzdem im Managed Pool liegen, wenn du sie nicht bearbeiten willst.

Du brauchst eigentlich keinen Zugriff auf Surfaces. Folglich brauchst du eigentlich auch keine Surfaces zu zerstören. Ansonsten gilt dasselbe wie oben.

---

Wenn du noch Fragen hast (und ich bin sicher, du hast jetzt einige neue, auch wenn die alten beantwortet sind (c; ), dann frag' nur. Wenn du C++ lesen kannst, kann ich dir auch den Code von meinem Spriterenderer schicken, der macht genau das, was ich da oben beschrieben habe.

Die meisten Fragen beantwortet aber das DirectX SDK, insbesondere alles, was im DirectX Graphics -> Programming Guide steht...

--- und noch ein Addendum:

Wenn ich richtig verstehe, nutzt du den Vertexbuffer nur als Speicher für deine eigenen Routinen. Dafür ist er nicht gedacht. Er ist dafür gedacht, Vertices (d.h. die 3D-Punkte, die die Grafikkarte direkt rendern soll) darin zu speichern. Wenn eh' nur die CPU damit arbeitet, ist es effizienter, ein pimpfiges Array zu verwenden. Das gilt auch, wenn du meine oben beschriebene Methode verwenden willst - in den Vertexbuffer gehören dann die vier Eckvertices des Vierecks, die Koordinaten der Sterne (die ja nur punktförmig sind), hältst du besser in einem Array, denn aus ihnen musst du (sprich die CPU) ja die Matrizen errechnen. Die Farbe (die du auch in deinem Array speicherst) gibst du den Sternen übrigens, indem du den Texture Factor festlegst, und als Farboperation die Multiplikation der Texturfarbe mit dem Texture Factor angibst.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat