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

11

27.02.2009, 14:10

Um das Thema nochmal aufzugreifen: Wie sieht denn eurer Meinung nach die optimale Vorgehensweise bei einer Bitmapfont-Klasse aus? In Davids Buch werden ja bei jedem DrawText transformierte Vertizes im Systemspeicher gefüllt und dann mit DrawPrimitiveUP gerendert. Was ist hier am schnellsten? Denkbar wären ja noch folgende Möglichkeiten:
  • Vertexbuffer erstellen (in jedem Frame neu, wegen der Variablen Größe/Länge des Textes?) und dann transformierte Vertizes hineinladen, um diese in einem Rutsch zu rendern
  • Vertexbuffer erstellen, jedoch untransformierte Vertizes hineinladen. Aber dann muss ich doch für jeden Buchstaben vor dem Rendern eine neue Transformationsmatrix setzen, oder nicht?
Irgendwie muss man doch den Vertexbuffer sowieso immer neu locken, da sich ja nicht nur die Position des Textes ändert (das wäre ja noch durch Weltmatrizen zu lösen), sondern auch der Text selbst.

Es würde mir echt weiterhelfen, wenn ihr mir da eure Erfahrungen mitteilen würdet.

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

12

27.02.2009, 14:31

kommt darauf an:

wenn viel text, dann in einem dynamischen vertexbuffer und dann transformieren.

ansosnten reicht die DrawPrimitiveUP mit vortransformierten vertices vollkommen.

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

13

27.02.2009, 14:46

Zitat

wenn viel text, dann in einem dynamischen vertexbuffer und dann transformieren.

Kannst du das etwas näher erläutern? Den Vertexbuffer soll ich dann wahrscheinlich mit dem Flag D3DUSAGE_DYNAMIC erstellen, richtig?

Wie regele ich das mit der Länge des Textes, die ja immer variiert? Soll ich einfach bei Programmstart einmalig einen Buffer mit einer festgelegten Maximalgröße erstellen oder etwa in jedem Frame einen neuen, auf die zu rendernde Textlänge angepassten Buffer (wobei dann ja auch ein statischer reichen würde)?

Womit fülle ich den Buffer? Soll ich für jeden Vertex erst einmal genau dieselben Koordinaten eintragen und dann erst nachher für jeden Buchstaben einzeln die passende Matrix setzen? Das kann ich mir irgendwie nicht sehr effektiv vorstellen, da man ja dann nicht in einem Rutsch rendern kann. Aber wenn ich die Koordinaten bereits vorher in dem Vertexbuffer selbst richtig eintragen will, muss ich doch sowieso vortransformierte Vertizes nehmen, oder?

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

14

27.02.2009, 15:05

Zitat von »"ph4nt0m"«

Den Vertexbuffer soll ich dann wahrscheinlich mit dem Flag D3DUSAGE_DYNAMIC erstellen, richtig?


exakt. und beim locken am besten als flag mit discard, da du sowieso alles neu berechnest.

Zitat von »"ph4nt0m"«

Wie regele ich das mit der Länge des Textes, die ja immer variiert? Soll ich einfach bei Programmstart einmalig einen Buffer mit einer festgelegten Maximalgröße erstellen oder etwa in jedem Frame einen neuen, auf die zu rendernde Textlänge angepassten Buffer (wobei dann ja auch ein statischer reichen würde)?


der dynamische hat den sinn, dass man ihn ständig manipulieren will. du speicherst dir einfach immer die anzahl der zeichen die du grad im vb hast und kannst die anzahl der gültigen vertices ausrechnen. ist der vb voll, musste erst rendern und dann den rest dazu.



Zitat von »"ph4nt0m"«

Womit fülle ich den Buffer? Soll ich für jeden Vertex erst einmal genau dieselben Koordinaten eintragen und dann erst nachher für jeden Buchstaben einzeln die passende Matrix setzen? Das kann ich mir irgendwie nicht sehr effektiv vorstellen, da man ja dann nicht in einem Rutsch rendern kann. Aber wenn ich die Koordinaten bereits vorher in dem Vertexbuffer selbst richtig eintragen will, muss ich doch sowieso vortransformierte Vertizes nehmen, oder?


gleich an die stelle wo der text auch hin soll, also am besten selbst transformieren, bevor du in den vb einträgst.

dazu eine allgemeine anmerkung: batching ist schön und gut, aber immer alles in einem kann das batchen länger dauern als einfach 1-2 draw-calls mehr!

NACHTRAG:

ich empfehle dir wenn du was sparen willst beim per hand transformieren mache das nicht mit ner matrix sondern alles einzeln, spart einige multiplikationen:

pos = scale * vertexpos + translation

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

15

27.02.2009, 15:24

Das heißt, ich soll den einzelnen Vertizes wirklich direkt im Buffer ihre gewünschten 2D-Bildschirmkoordinaten in absoluten Pixeln geben und dann beim Rendern nur noch die passende orthografische Projektionsmatrix setzen?

Zitat

batching ist schön und gut, aber immer alles in einem kann das batchen länger dauern als einfach 1-2 draw-calls mehr!

Wie ist das zu erklären? Meinst du der Overhead, der durch die ganze möglichst Zeichenaufruf-schonende Organisation der Daten entsteht, braucht am Ende mehr, als einfach mehrfach zu zeichnen?

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

16

27.02.2009, 15:27

Zitat von »"ph4nt0m"«

Das heißt, ich soll den einzelnen Vertizes wirklich direkt im Buffer ihre gewünschten 2D-Bildschirmkoordinaten in absoluten Pixeln geben und dann beim Rendern nur noch die passende orthografische Projektionsmatrix setzen?


naja entweder orhtogonale projektionsmatrix oder vortransformiert musst du wissen^^

Zitat von »"ph4nt0m"«


Zitat

batching ist schön und gut, aber immer alles in einem kann das batchen länger dauern als einfach 1-2 draw-calls mehr!

Wie ist das zu erklären? Meinst du der Overhead, der durch die ganze möglichst Zeichenaufruf-schonende Organisation der Daten entsteht, braucht am Ende mehr, als einfach mehrfach zu zeichnen?


exakt. aber das muss man ausprobieren.

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

17

28.02.2009, 16:22

Ich habe jetzt die erste Version meiner Schriftklasse fertig und mich für den Vertexbuffer mit untransformierten Vertizes entschieden. Allerdings gibt es beim Rendern ein unschönes Problem: Links und oberhalb eines Buchstabens entstanden irgendwie unschöne Verformungen (es soll ein O sein):

(Link)

Ich habe dann den Hinweis aus der DirectX Dokumentation befolgt und von allen acht Koordinaten der vier Vertizes jeweils 0.5f subtrahiert. Es sieht jetzt zwar besser aus, aber in folgender Animation wird dennoch ein recht großer Unterschied zum Original deutlich: Vergleich
In Normalgröße wirkt der Buchstabe dann viel unschärfer als im Original. Woran kann diese Verzerrung liegen?

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

18

28.02.2009, 20:40

das problem hatte ich auch. war aber soweit ich mich erinnern kann auf das texelmapping zurückzuführen.

was noch sein könnte: wenn du fenstermodus hast, dass die projektionsmatrix genau so für den gegebenen clientbereich ausgelegt ist?

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

19

28.02.2009, 23:25

Mensch, wenn ich dich nicht hätte :D Der zweite Hinweis war goldrichtig: In meinen Aufruf von AdjustWindowRectEx (um den Clientbereich passend zu machen) hatte sich unerklärlicher Weise bei bMenu ein true eingeschlichen. Da hätte ich zuletzt nach dem Fehler gesucht :o Großes Dankeschön ;)

Werbeanzeige