JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Text auf Texture zeichnen
Gehe zu Seite Zurück  1, 2, 3
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 06.08.2006, 20:40    Titel: Antworten mit Zitat

Also ich habe jetzt ja eine schöne Funktion die aus einem beliebigen Text eine Textur erstelt.
Leider ist die sau lahm, da ich erst eine Textur erstelle und die dann Pixelweise in eine andere kopiere.
Das ist auch ganz net und wenn sie einmal erstellt ist schnell und ich kann die auch toll bneutezn um den Text zu drehen oder Skaliern oder was weiß ich.
Nur wenn ich z.B. ein Hud progge, wo alle jeden Frame neu erstellet werden muss kann es halt zum ruckeln kommen.
Die andere Alternative wäre wohl jeden Buchstaben einen Sprite zuzuordnen, aber das ist kompliziert und bei längern Texten wohl auch langsam.
D3DX wollte ich auch nicht benutzen, da es die exe so groß macht. Jemand noch ne gute Idee?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
GreveN
JLI Master


Alter: 37
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 06.08.2006, 21:02    Titel: Antworten mit Zitat

Jonathan_Klein hat Folgendes geschrieben:
Die andere Alternative wäre wohl jeden Buchstaben einen Sprite zuzuordnen, aber das ist kompliziert und bei längern Texten wohl auch langsam.

Nicht wirklich, wichtig ist eben, dass du nicht für jeden Buchstaben (=Sprite) einen eigenen Vertexbuffer verwendest etc. und beim Rendern zigmal die Textur setzt, sondern den kompletten Text in einem Rutsch renderst. Das Thema hatten wir ja erst. ;)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 06.08.2006, 21:42    Titel: Antworten mit Zitat

ich mache das so: ich hab für einen kompletten 256er Zeichensatz eine Bitmap (oder jede andere Bilddatei) die lade ich in _eine_ textur. Und alles kommt in _einen_ VB. Da die Schrift datei in 16x16 Zeichen eingeteilt ist, also 256 kongruente Rechecke bzw. Quadrate, schreibe ich in der VB (nicht dynamisch) genau 16x16 Quads mit 16x16x2 Dreiecken, also 17x17 Vertices.Für den IB also 16x16x2x3 Indices. Dann noch nach die entsprechenden Texturkoordinaten ausrechnen, und in einen Index Buffer die Indices schreiben. Der sieht dann so aus:
Code:

// Quad-Vertices
0-1-2-3-4...16
17-18-19-20...32
...256

// IB-Inhalt (cullmode CCW)
17, 0, 1, 17, 1, 18 usw. das sind die ersten 2 Dreiecke.

Dann speichere ich noch die Positionen jedes Buchstabens (also die Mitte jedes Rechtecks) vom lokalen Ursprung aus in einem Array, um später den Buchstaben in den lokalen Ursprung zu transformieren. Dann wird für einen Satz eben nur der VB gesetzt, der IB gesetzt, für jeden Buchstaben die Matrix gesetzt und alles gerendert. Das ganze kann man beliebig weit optimieren.

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 10.08.2006, 15:14    Titel: Antworten mit Zitat

Für jedne Buchstaben die Matrix rendern, bedeutet, das du alle Buchstaben einzelnt rendern musst, oder?

Ich meine evlt. würde es schneller gehen aus einem Haufen von Dreieecken einen Vertexbuffer zusammen zu bauen, der dann halt entsprechend den gesamten Text enthält. Nur ist das ja sehr viel komplizierter und man kann nicht so einfach die Schirfart ändern, da man letztendlich für alle jeweils eine Texturdatei usw. haben muss.
Dann müssten auch alle Zeichen gleich groß sein, oder man müsste das ganze noch komplizierter machen.
Das schöne an meiner Idee war ja quasi, das man das Zeichnen GDI überlassen konnte und so auch jede beliebige Schriftart laden könnte.
Ich habe auch mal versucht mit GDI den Text direkt auf den Bidlschirm zu malen, aber das hat bei einigen zu ziemlichen Problemen geführt.

Irgendwie müsste man das doch Performant hinbekommen, einen Text auf eine Textur zu kiregen, oder? Die größte Schwachstelle bei mir ist ja quasi das Pixelweise rüberkopieren auf die neue Textur, um den Alphachannel zu bekommen. Und das nur weil GDI kein Alhachannel unterstützt?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 10.08.2006, 15:24    Titel: Antworten mit Zitat

Mhh wieso nutzt ihr nicht einfach die Font Extension von DirectX? Die kann doch alles. Und das ganze auf ne Textur zu bringen sollte nicht das Problem sein.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 10.08.2006, 16:06    Titel: Antworten mit Zitat

Weil dann meine exe Datei 3 mal so groß wäre. Hm, es sit nciht zufällig möglcih, nur diese Text-Funktionalitäten einzubinden?
Naja, ich hab ein wenig versucht meine Funktion zu optimierne, indem z.B. die erste Textur in SystemMemory liegt, da die ja nur gelesen werden muss. Ich könnte mir einen Kopiervorgang sparen, indem ich direkt in der Schleife wo ich prüfe ob Alphachannel gesetzt werden muss oder net die entsprechenden Daten übertrage. Aber dann hätte ich seh viele aufrufe und nicht wie bei der jetzigen Methode einmal ein memcpy. Obwohl, ist das nicht auch eigenlich ne Schleife? Und ist beim locken nicht sowieso die ganze Textur temporär im SysMem nur das locken dauert eben länger weil die übertragen werden muss?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 10.08.2006, 20:21    Titel: Antworten mit Zitat

Also ich hab auch vor mir demnächst mal meine eigene Textklasse zu schreiben (im Moment verwend ich die D3DX Klasse). Das hat zwei Hauptgründe: Erstens erstellt die D3DX Klasse keine vollständige Zeichensatztextur (die Umlaute fehlen zum Beispiel) und zweitens möchte ich mit einer Textklasse sowohl aus Bilddateien geladene Schriftarten als auch aus Schriftarten erstellte Schriften verwenden können.
Ich würde dir empfehlen dir einfach mal den Code in der CD3DFont.cpp anzuschauen. Habe ich auch schonmal gemacht. Ist recht leicht nachzuvollziehen und wird wohl effizient gemacht sein.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 11.08.2006, 15:29    Titel: Antworten mit Zitat

CD3DFont.cpp findet der bei mir net. Habe beide Festplatten durchsucht, gibt es net^^

Mir ist da noch ne zweite Möglichkeit eingefallen.
Ich erzeuge die Textur nicht jedesmal neu, sondern schreibe sie in eine map, die aus dem String auf die Textur verweißen kann. Texte die längere Zeit nicht angezeigt werden könnte ich so dann auch wieder löschen. Obwohl es natürlich einiges an speicher verbraucht, so viele Texturen dauerhaft zu speichern.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 12.08.2006, 00:18    Titel: Antworten mit Zitat

Kein Wunder. Heißt ja auch d3dfont.cpp Very Happy . Müsste irgendwo im DX SDK zu finden sein. Mein Fehler.

Und hab ich dich gerade richtig verstanden? Du erzeugst die Textur bei jedem Text rendern neu Shocked . Wenn ja solltest du dir diesen Post von DirectXer nochmal genau durchlesen Wink . Das ist nämlich auch die Methode die in d3dfont benutzt wird. _Einmal_ beim Spiel laden eine Textur erstellen in der der komplette Zeichensatz drin ist (oder die Teile davon, die du brauchst) und dann zum Textrendern VBs mit Vertexrects erstellen, die über ihre Texturkoordinaten auf die entsprechenden Zeichen verweisen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Gehe zu Seite Zurück  1, 2, 3
Seite 3 von 3

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum