![]() |
Mit DirectX->DrawPrimitive umrandete Flächen zeichnen
Hi!
Also, vorab: Ich Verwende immer noch Delphi 3.0 Pro :oops:, mangels eine besseren Version, zusammen mit DelphiX von Hiroyuki Hori :oops:. Ich habe zwar auch ein Delphi7 Pe, auch mit DelphiX, aber ich verwende es nur sehr ungern zum programmieren. Aber dass nur zur Info, meine Frage bezieht sich mehr auf Microsoft DirectX. Ich habe folgendes Problem: Ich möchte mit der Function "DrawPrimitive" eine Fläche (bestehend aus mehreren Dreiecken) rendern und mit einer Farbe ausfüllen (also OHNE Texture). Ok, das klappt. Aber ich möchte dass das Dreieck sagen wir mal Innen mit Rot ausgefüllt und außen herum ein blauer Rand gezeichnet wird. Und das ist das Problem, ich weiß echt nit wie. Ich habe schon die halbe MSN-Bib nach einer Lösung abgesucht. Es gibt nämlich ein Problem mit dem Z-Puffer bei dieser Sache. Also, im Moment zeichne ich das Dreieck (bzw. eine komplexere Form aus Dreiecken) mit DrawPrimitive->TriangleList oder ->TriangleStrip, und anschließend zeichne nochmal den Rahmen herum mit DrawPrimitive->LineList oder ->LineStrip. Das ist erstens nicht sehr Effektiv und zweitens führt dies dazu das der Rand um das Objekt herum optisch zerrissen wird, also keine durchgezogene Linie. Und das liegt daran das der (blaue) Pixel vom Rand in Z-Richtung mal vor, mal hinter dem (roten) Pixel der Dreieck-Fläche berechnet wird :gruebel:. Je nachdem wie ich die Form sich dann im 3D-Raum bewegen und rotieren lasse ist der Rahmen mal durchgezogen, mal gestrichelt und mal leider völlig unsichtbar. :? Meine Frage: Kennt einer von Euch eine Lösung für diese Problem? Vielleicht einen RenderState denn man setzen kann? Oder irgendeinen FillMode, oder was auch immer. Ich bin für jeden Hinweis zur Lösung dieses Problems echt dankbar. MfG, TOC! |
Re: Mit DirectX->DrawPrimitive umrandete Flächen zeichnen
Zwei Dinge fallen mir ein:
1) Über eine Textur, die eben einen blauen Rand und rotes Inneres hat. Nachteile: Die Texcoords könnten evtl. gräßlich werden, und der Rand wächst mit der Fläche eines Dreiecks - ist also u.U. verschieden Dick in ein und dem selben Patch. 2) Mache den Wireframe-Pass mit einem gaaanz leicht "gewachsenem" Patch. Die Normalenvektoren für jeden Vertex hast du ja wahrscheinlich schon, also dann einfach die Vertices um einen Bruchteil ihres Norm. verrücken. Da es ja wirklich nur um ein "Titsch" geht und es ein Wireframe wird ist, ist das sonst dabei teilweise auftretende Problem der Selbstschneidung kaum vorhanden bzw. von Bedeutung. (Nämlich hochstens dort, wo sich das Objekt selbst berührt.) |
Re: Mit DirectX->DrawPrimitive umrandete Flächen zeichnen
Hi!
Vielen Dank für Deine Antwort und Deine Vorschläge. Zitat:
Zitat:
Echt blöd. Fällt Dir, oder sonst irgend jemandem da draußen, vielleicht noch etwas anderes zur Lösung dieses Problems ein? Ich freue mich über jeden weiteren Vorschlag und jede weitere Idee! Grüße von TOC! |
Re: Mit DirectX->DrawPrimitive umrandete Flächen zeichnen
Versetzen auf der Z-Achse ist nicht was ich vorgeschlagen hab ;) Dass das oft nicht ganz zum Ziel führt ist klar. Deswegen ja um die Normalenvektoren verschieben!
Edit: Noch was. Viele machen auch den Fehler, das Near- und Far-Clipping vieeel zu nah bzw. weit zu setzen, wodurch sich der Z-Buffer arg auseinanderzieht. Vor allem ist da wohl das Near-Clipping kritisch, da sich der Z-Buffer logarithmisch von vorn nach hinten verteilt, so dass du je näher ein Objekt ist eine größere Auflösung in Z hast. Das hilft zwar auch nichts wenn du garnicht oder nur um Z verschiebst, aber damit kann man sich mit meiner Methode mit recht kleinem Wachstum begnügen ohne dass einem der Z-Buffer zu schnell einen Strich durch die Rechnung macht. Im Zweifel kannst du auch einfach mal den Z-Buffer in 32Bit versuchen (können nur nicht alle GraKas, und der Stencil-Buffer ist flöten - wenn du den brauchst). |
Re: Mit DirectX->DrawPrimitive umrandete Flächen zeichnen
Hi!
Zitat:
Auf jeden Fall Danke für Deine Antwort, ich raufe mir hier schon die Haare aus :? Wenn ich keine Lösung finde hab ich bald ne Glatze :(, und das obwohl ich Glatzen hasse :mrgreen: ! Grüße von TOC. |
Re: Mit DirectX->DrawPrimitive umrandete Flächen zeichnen
Zitat:
Delphi-Quellcode:
Also NearClipping 50 und FarClipping 20000000. Meinst Du das es daran liegen könnte?
...
D3DUtil_SetProjectionMatrix(Matrix, Pi/4, Aspect, 50, 20000000); ... Ich könnte das Programm auch Posten dann könntest Du es Dir genauer ansehen was mein Problem ist- obwohl ich dies nit gerade so gerne tun würde, weil es ist nur ein DxTest-Programm und auch noch nit fertig... Aber wenn es helfen würde dann würde ich es Posten (die .exe). Grüße von TOC! |
Re: Mit DirectX->DrawPrimitive umrandete Flächen zeichnen
Hi Medium!
Vielen Dank für Deine Vorschläge und Hilfe, es hat mich auf einige neue Ideen gebracht. Zitat:
Wie Du das mit dem verschieben um die Normalen meinst habe ich immer noch nit kapiert, aber, egal, mir ist ein neuer Trick eingefallen. Also, ich berechne mir zuerst die 4 Vektoren von dem Rechteck, dann ziehe ich davon zweidimensional gesehen einen einstellbaren kleinen Betrag ab und berechne nochmal 4 Vektoren für ein etwas kleineres Rechteck bzw. Quadrat. Zum Zeichnen der ausgefüllten Fläche nehme ich dann das kleinere Quadrat, und zeichne nun ZWEI mal den WireFrame herum, einmal mit dem etwas verkleinerten Vektoren und einmal mit den Vektoren in Normalgröße- funzt super! Mit dem ausgesparten Rechteck/Quadrat im Inneren Umrande ich das ganze ebenso. Ok, es ist etwas mehr Rechen- und Zeichenaufwand, weil ich ja den inneren und äußeren Rand nun 2 mal Zeichne, also 4 Ränder, und das pro Quadrat, also mal 6 für meinen Würfel. Trotzdem: Der Aufwand lohnt sich, da die Umrandungen jetzt nahezu aus durchgezogenen Linien bestehen und die Optik 10 mal besser ist. Und als Nebeneffekt sehen die Umrandungen jetzt auch noch etwas dicker aus als vorher, das erleichtert das erkennen der Grafik enorm! Grüße von TOC! |
Re: Mit DirectX->DrawPrimitive umrandete Flächen zeichnen
Mit um die Normalenvektoren verschieben meine ich quasi einfach "V+k*N", V ist ein Vertex, N sein Normalenvektor, und k ein kleiner konstanter Wert um den das Mesh wachsen soll. Da die Normalen ja immer "von der Oberfläche weg" zeigen, bewirkt ein Verschieben um diese eben ein Wachstum des Volumens. Im Fall eines zentrierten Würfels ist das gleich einer Skalierungsmartix, bei komplexeren Objekten ist das Ergebnis allerdings unterschiedlich, und eine reine Skalierung ist dann nicht mehr wirklich zielführend (da man sich dann auch Teile "in" das vorige Objekt hinein schiebt).
Ein weiterer Vorteil dessen ist, dass die Normalenvektoren nachher auch noch stimmen ohne sie neu zu berechnen. Auch das ist bei einer einfachen Skalierung nicht unbedingt mehr gegeben. |
Re: Mit DirectX->DrawPrimitive umrandete Flächen zeichnen
Hi Medium!
Zitat:
Zitat:
Gerade schreibe ich meine Rechteck-Funktion, aus der ich ja meinen Würfel zusammen setzte, nochmal um. Dank Dir bin ich auf diesen Gedanken gekommen: Ich zeichne jetzt nicht mehr einen einfachen WireFrame 2 mal, sondern ziehe einen einstellbaren Betrag von der Länge und Höhe ab, und diese dadurch außen neu entstehenden Rechtecke fülle ich dann wieder mit DrawPrimitive->TriangleList in einer anderen Farbe aus. Mit anderen Worten: Ich mache die Rahmenbreite nun mit einstellbarer Breite. Vielen Dank das Du mich auf diesen Idee gebracht hast :thumb: ! Grüße von TOC! |
Re: Mit DirectX->DrawPrimitive umrandete Flächen zeichnen
Immer gern. 3D Gefummel macht halt auch immer wieder Spaß :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz