Kreise mit DirectX
-
Hi,
ich bin dabei Kreise zu zeichnen. Bis jetzt hab ich den Kreis nur mithilfe
einer eigenen Funktion gezeichnet:for (int i=0; i<50; i++) { pointList[iPunkte].x = AufloesungX/2 + cos(2*PI*i/50)*20; pointList[iPunkte].y = AufloesungY/2 + sin(2*PI*i/50)*20; pointList[iPunkte].color = D3DCOLOR_XRGB(1000,0,0); iPunkte++; }
Besonders schön ist das wohl aber nicht oder?
Rechenaufwand hoch?
-Die Kreise sind außerdem komischerweise Ellipsen!?
-Manchmal zuwenig/zuviel Punkte
Gibt es vielleicht eine eigene Funktion im DirectX SDK?
Wie könnte ichs vielleicht besser machen?Grüße
Huddi
-
Hallo huddi,
leider kenne ich mich mit DirectX nicht aus, aber ich mag bezweifeln, dass es eine eigene Funktion dafür gibt.
Bei deiner Lösung kannst du leicht die Performance verbessern, indem du die Anzahl an Rechenoperationen reduzierst:
Berechne die z.B. einmal 2*PI vor, dann kannst du es in deinem kompletten Code verwenden (wird vermutlich öfter vorkommen). Alleine hier sparst du dann pro Renderdurchlauf 99 Multiplikationen ein. Analog würde ich bei AufloesungX/2 bzw. AufloesungY/2 vorgehen (spart 98 Divisionen).Man könnte noch etwas Performance einsparen, wenn man nur ein Viertel des Kreises berechnet. Die restlichen Werte lassen sich über die Symmatrieeigenschaften "berechnen".
Ich hab´s nicht getestet, aber ich vermute, dass die verzerrung an den Summanden AufloesungX/2 bzw. AufloesungY/2 liegt. Wenn die Auflösung in X- und Y-Richtung nicht gleich ist, sollte eine Ellipse entstehen.
Mit freundlichen Grüßen,
MaBa
-
DirectX bietet nicht die Funktion einen Kreis zu zeichnen(Zumindest hab ich keine gesehen mit DirectX 6.0 bis 9.0). So wie du das machst ist es schon gut und kostet auch "keine" Performance, da du die geometrische Figur "Kreis" nur einmal benötigst und weitere gerenderte Kreise nur durch Transformationsmatrizen realisierst, somit werden keine weiteren verticies benötigt.
Die Kreise solltest du dann mit der Option "Triangle Fan" rendern, dann brauchst du nur noch den Mittelpunkt an den Anfang der Verticies hinzufügen.
Die Ellipsenform kann an einer falschen Projektionsmatrix oder Viewmatrix liegen. Wenn die Ellipsenform sich ändert(wir schmaler/breiter) während du die Perspektive änderst, dann ist garantiert eine Matrix falsch.
Oder evtl. aspect Ratio falsch gewählt. (z.B. 4:3, aber Auflösung ist 1:1);Fehlende Punkte kann ich nicht erklären, evtl. werden sie nicht gerendert weil sie durch Rundungsfehler gerade so nicht mehr sichtbar wären?
-
Was vom DirectX SDK verwendest du? DirectDraw? Direct3D?
Falls Direct3D, welche Version?
Ab D3D10 gibt es nehmlich keine Trianglefans mehr. Und eine Funktion für Kreise gibt es auch nicht.Und zu den Performance-Verbesserern, die MaBa angesprochen hat:
Die Variante mit dem Viertel-Kreis ist tatsächlich gut.
Aber die mehrfachen Multiplikationen/Divisionen mit der selben Zahl optimiert dir dein Compiler.
-
Danke für die Antworten!
und weitere gerenderte Kreise nur durch Transformationsmatrizen realisierst
Bis jetzt schmeiße ich alles, was ich zeichne in meine Punktliste und zeichne
es dann mit dem jeweiligen "drawprimitive".
Ist das falsch?Oder meinst du mit transformationsmatrix benutzen, dass ich mir eine separate
Matrix mit den Kreispunkten erstelle (bzw einem viertelkreis) und dann jeweils
auf den aktuellen kreis verändert in die Punkteliste schreibe?edit: verwende D3D8, da gibts noch trianglefan
-
Normalerweise hat man eine Vorlage, in deinem Fall der Kreis. Diese Vorlage enthält die Verticies eines (Norm-)Kreises. Dann nimmst du eine Worldmatrix und Transformierst(Translation, Rotation, Skalierung) diese Vorlage so wie du deinen Kreis haben möchtest, dann renderst du den Transformierten Kreis. Das wiederholst du für alle deine Kreise, somit hast du als Verticies nur den (Norm-)Kreis im Speicher und für jeden Kreis der gerendert wird eine Worldmatrix. Es ist eine speicherverschwendung für jeden Kreis jedesmal Verticies abzuspeichern, da die Matrix wesentlich kleiner ist und D3D auf diese Verfahren optimiert wurde.