Umgang mit Schriftarten variabler Größe in XNA 4.0


7

Nachdem ich eine Weile gesucht hatte, fand ich keine Möglichkeit, Vektor- / skalierbare Schriftarten in XNA 4.0 zu zeichnen (was perfekt wäre ...), und ich bin derzeit in der Klemme, wie Schriftarten für mein Spiel gerendert werden sollen.
Im Spiel verwende ich Schriftarten mit variabler Größe, die von sehr klein bis ziemlich groß reichen, und ich habe keine Ahnung, wie ich damit effizient umgehen soll.

Die einzige Möglichkeit, die ich derzeit erreichen kann, besteht darin, eine große Anzahl von SpriteFonts unterschiedlicher Größe zu laden, manuell die Schrift auszuwählen, die der gewünschten Größe am nächsten kommt, und dann die Größe mit einer Skala nahe 1 zu optimieren. (Auch eine Skala groß oder zu klein lässt die Schrift schrecklich aussehen.) Ich habe auch angefangen, den Nuclex-Schriftprozessor zu verwenden, wodurch die Schrift etwas besser aussieht, aber es ist offensichtlich nicht die Antwort auf mein Problem.

Gibt es wirklich keinen anderen Weg, um damit umzugehen?
Es scheint mir sehr seltsam, dass etwas so Aufwendiges und Gutes wie XNA 4.0 einen so tiefen Mangel an Werkzeugen für das Rendern von Schriftarten hat.

Dies ist derzeit ein ziemlich großes Problem für mich, daher sind jede Hilfe und jede Idee, wie ich damit umgehen oder sogar die Schmerzen lindern kann, sehr willkommen.


1
+1 Ich habe mich schon einmal darüber gewundert und bin zu dem gleichen Schluss gekommen wie Sie. Würde wirklich gerne eine bessere Lösung wissen :)
David Gouveia

Ist es nicht möglich, die Vektorumrisse eines ttf in Dreiecke zu zerlegen und die Formen dann in 3D zu rendern?
Quasiperfect

Was ist Ihre Zielplattform? Unter Windows können Sie die Inhaltspipeline-Assemblys zur Laufzeit verwenden, um Assets dynamisch zu generieren.
3Dave

Antworten:


3

Dies ist kein leicht zu lösendes Problem. Wenn die Technik "Mehrere Sprite-Schriftarten" für Sie nicht funktioniert, gibt es in XNA keine andere integrierte Möglichkeit, um das zu erhalten, was Sie möchten. Sie müssen also eine benutzerdefinierte Entwicklung durchführen.

Eine Methode ist die Verwendung der Valve-Technik, wie in diesem Artikel beschrieben: Verbesserte Alpha-getestete Vergrößerung für Vektortexturen und Spezialeffekte . Dies beinhaltet speziell codierte Texturen und einen speziellen Pixel-Shader. Ich habe das schon einmal implementiert und es ist nicht allzu schwierig. Die Ergebnisse sind vernünftig, wenn auch nicht perfekt.

Eine weitere erwägenswerte Methode besteht darin, das Rendern von Schriftarten nach Windows zu verlagern (das Rendern von Schriftarten in eine Textur - genau wie die Inhaltspipeline zum Erstellen von Bitmap-Schriftarten). Dies hat den zusätzlichen Vorteil, dass Sie jedes Zeichen aus Ihrer Schriftart verwenden können und nicht nur das, was Sie in der Bitmap-Schriftart verfügbar haben. Wenn Sie ganze Zeichenfolgen auf einmal rendern, erhalten Sie eine angemessene Leistung, wodurch viele Internationalisierungsprobleme von Sprite-Schriftarten gelöst werden.

Eine andere Methode besteht darin, einfach Vektorschriftarten zu verwenden (mindestens über einem bestimmten Größenschwellenwert). Dies ist wahrscheinlich der einfachste Weg, um zu arbeiten - auf der Grundlage, dass Sie nur Nuclex.Fonts verwenden könnten .

Schließlich könnte dieser Beitrag für einige zusätzliche Ideen lesenswert sein.


0

public void DrawString ( SpriteFont spriteFont, string text, Vector2 position, Color color, float rotation, Vector2 origin, Vector2 scale, SpriteEffects effects, float layerDepth )

Wenn mir nichts fehlt, ist DrawString skaliert.


5
Das Problem ist, dass die Schriftart, sobald sie die Inhaltspipeline durchlaufen hat, in eine Bitmap umgewandelt wird. Der scaleParameter skaliert also diese Bitmap, was zu einem Qualitätsverlust führt, den er vermeiden möchte.
David Gouveia

genau wie @DavidGouveia sagte - Skalierung ruiniert die Qualität völlig (es sei denn, die Skalierung liegt sehr nahe bei 1). Nuclex hilft dabei ein wenig (und macht Schriftarten im Allgemeinen nur hübscher), aber es ist noch lange keine Lösung für dieses Problem.
Acidic

Ah, nun, ich lasse es hören, falls es eines Tages einem Neuling hilft.
Cyral

Ein bisschen spät zur Party, aber ich glaube, ich habe eine Lösung für das "Scale" -Ding gefunden. Ich generiere das Sprite einfach groß genug (in meinem Fall 128pt) und skaliere es dann auf die gewünschte Größe. Es hält die Qualität recht gut.
Kreuzerkrieg
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.