Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

1

21.03.2009, 15:23

[Direct3D] Rasterung von grafischen Primitiven

Hallo,
ich möchte in meinem aktuellen Direct3D-Projekt zweidimensionale Objekte wie Linien und Kreise zeichnen und stehe nun vor dem Problem, die richtige Vorgehensweise dafür zu wählen.

Die Option, solche Objekte als Texturen aus vorgefertigten Dateien zu laden und dann auf ein jeweils passendes Quad zu mappen fällt für mich weg, da mir doch einiges an Flexibilität fehlt (ein Kreis z.B. wäre ja dann immer unscharf, sobald man ihn nicht in der originalen Texturgröße rendert).

Eine Alternative wären D3DPT_LINESTRIPs, aus denen man dann (bei entsprechender Unterteilung) wohl auch Kreise erstellen könnte. Aber inwiefern könnte man hier dann beispielsweise die Dicke der Linie beeinflussen?

Und was ich mir als dritte Möglichkeit überlegt habe: Wäre es denkbar, für jedes zu zeichnende Objekt eine passende Textur zu erstellen, diese zu sperren und dann durch das Setzen von einzelnen Pixeln nach bekannten Rasterungsalgorithmen die Objekte direkt in die Textur zu zeichnen? Anschließend könnte man diese 1:1 auf ein Quad mappen. Die Frage ist eben, wie sich das in Sachen Geschwindigkeit zu den anderen Methoden verhalten würde.

Was würdet ihr bevorzugen oder was verwendet ihr selbst in euren Projekten? Ach so: Auf D3DX möchte ich aus bestimmten Gründen vollständig verzichten.

2

21.03.2009, 15:43

In deinem Direct3D-Projekt möchtest du D3DX verzichten? :?

How ever, via D3DX und Texturen sollte das einigermaßen hinhauen.
Siehe Filter, Dither und/oder Mipmaps.
Könnstest auch eine 3D-Kugel rendern, ergibt ja auch einen Kreis. ;)

Sonst siehe GDI-Funktionen wie Ellipse, Arc, Bezier usw.
fka tm

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

3

21.03.2009, 16:31

Zitat

via D3DX und Texturen sollte das einigermaßen hinhauen

Wo genau willst du denn hier D3DX verwenden? Den Qualitätsverlust, welchen das Skalieren einer Textur unvermeidbar verursacht, kann man doch auch damit nicht verhindern, oder?

Zu den GDI-Funktionen: Die sind mir bekannt, bieten jedoch soweit ich weiß kein Antialiasing. Aber die Implementierung eigener Funktionen ist auch nicht das Problem. Meine Frage war vielmehr, ob es überhaupt empfehlenswert ist, in eine Textur zu zeichnen und diese dann auf einem Quad darzustellen. Ich kann mir nämlich ehrlich gesagt nicht vorstellen, dass man die Methode mit skalierten Texturen in "professionellen" Spielen anwendet.

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

4

21.03.2009, 17:04

wenn du möglichst performance willst: dann geht das am schnellsten mit vertexbuffern und z. b. linelist.

wenn du dicke linien willst: mach es anstatt mit linelist dreiecken, da ich jetz nich weiss wie ich das beschreiben soll mal ich kunstvoll:


(Link)


deinen kreis nach diesem mesh, halt mehr segmente, und je nachdem wie dick die linien sein sollen die inneren vertices näher zum äußeren. je nachdem wie groß dein kreis ist sollten 24-48 segmente reichen.

5

21.03.2009, 17:04

Hab mal eine DDS-Grafik (X8R8G8B8) mit 3 Mipmaps erstellt.


(Link)


Ein bisschen Qualität ist verloren gegangen,
weil ich es fürs Web als PNG-8 gespeichert habe.

Alpha-Map drüber, auf ein Vertex-Quad geklatscht und ab dafür...
fka tm

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

6

21.03.2009, 17:11

@trikkiemikkie: ich dachte auch erst an mipmaps aber ich denke da wird man immer probleme haben was das rasterisiern angeht bei der skalierung, bei der die jeweilige mipmap nicht genau 1:1 gemappt wird.

7

21.03.2009, 17:15

Du kannst doch ein bestimmtes MipMap auswählen.
Skaliert wird da nichts.
Wenn du noch ein bisschen Multisampling drüber haust, sieht das butterweich aus.

Ich finde, das ist 'ne einfache und qualitativ akzeptable Methode.

Werd's bei Gelegenheit mal ausprobieren.
fka tm

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

8

22.03.2009, 00:17

@TrikkieMikkie: Aber bei deiner Lösung ist es nicht möglich, die Linienstärke eines (ungefüllten) Kreises zu verändern, oder? Außerdem ist es bestimmt auch nicht möglich, solche Kurven dynamisch darzustellen:

(Link)

Nichts für ungut, aber dass die Version mit den vorgefertigten Texturen sehr wahrscheinlich nicht in Frage kommt, habe ich ja im ersten Post bereits angedeutet.

Kann denn jemand über meine Idee mit dem Befüllen von Texturen aus dem Programm heraus ein paar Worte verlieren? Ich habe von dieser Technik bisher noch nichts gelesen. Es war vielmehr eine spontane Idee, aber vielleicht könnt ihr mir ja von vornherein sagen, dass ich meine Zeit damit nicht "verschwenden" muss.

bepo

Frischling

Beiträge: 33

Wohnort: Bayern

Beruf: Schüler

  • Private Nachricht senden

9

22.03.2009, 11:30

Zitat

Und was ich mir als dritte Möglichkeit überlegt habe: Wäre es denkbar, für jedes zu zeichnende Objekt eine passende Textur zu erstellen, diese zu sperren und dann durch das Setzen von einzelnen Pixeln nach bekannten Rasterungsalgorithmen die Objekte direkt in die Textur zu zeichnen? Anschließend könnte man diese 1:1 auf ein Quad mappen. Die Frage ist eben, wie sich das in Sachen Geschwindigkeit zu den anderen Methoden verhalten würde.


Das würde sich auch im Shader ohne Textur bewerkstelligen lassen (http://http.developer.nvidia.com/GPUGems3/gpugems3_ch25.html).

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

10

02.04.2009, 21:15

Um das Thema noch einmal aufzugreifen: Ich weiß im Moment nicht genau, wie modern die Grafikkarte für einen solchen Shader sein muss, aber ist das nicht allgemein ein bisschen zu viel des Guten für einfache Linien oder eben Splines, wie in dem GPU Gems 3 Beispiel?

Es ist doch so: Unter DirectDraw hätte man das doch auch gelöst, indem man einzelne Pixel des Backbuffers setzt. Und Direct3D soll doch nun (auch im 2D-Bereich) als vollständiger Ersatz dienen (können). Aber so einfach scheint das ja nicht zu sein. Themen wie Pixelshader sind sicherlich nett, aber meines Erachtens etwas zu fortgeschritten, wenn es mir doch nur um einfache Primitiven geht.

Wäre es denn eine Alternative, mit einzelnen Punkten und D3DPT_POINTLIST zu arbeiten? Oder eine Textur in Bildschirmgröße zu erstellen, dann auf diese zu zeichnen und sie anschließend auf ein Quad zu mappen? Wenn Direct3D auch für 2D zu verwenden sein soll, kann es doch irgendwie nicht so kompliziert sein. Oder würdet ihr etwa sagen, dass man in diesem Fall doch auf DirectDraw zurückgreifen sollte?

Werbeanzeige