2 Stimmen

OpenGL: Verzerrte Texturen, wenn nicht durch 2 teilbar

Ich habe eine Spiel-Engine, die OpenGL für die Anzeige verwendet. Ich habe ein kleines Menü dafür codiert, und dann bemerkte ich etwas Seltsames nach dem Rendern des Textes. http://img43.imageshack.us/i/garbagen.png/

Wie Sie sehen, ist die Schrift etwas unleserlich, aber die unteren Teile (wie "Tests") sehen wie vorgesehen aus. Offenbar beeinflusst die Position auf dem Bildschirm die Lesbarkeit, da die Ränder abgeschnitten werden. Die Schrift ist 9x5, ein Wert, den ich durch 2 teile, um Breite/Höhe zu erhalten und das Objekt von der Mitte aus zu rendern. Bei 4,5x2,5 Pixeln (ich verwende Fließkommazahlen für x, y, Breite und Höhe von einfachen Rechtecken) wird die Textur also durcheinander gebracht, wenn sie an einer anderen Stelle als x,5 oder so gerendert wird. Im Moment ist das nur auf zwei Computern der Fall, aber ich möchte nicht, dass dieser Fehler auftritt, da er den Text unlesbar macht. Ich kann die Größe auf 4,55x2,55 ändern (indem ich bei der Division durch 2 ein bisschen mehr Größe hinzufüge), und dann wird der Text auf allen Rechnern korrekt gerendert (oder zumindest tritt er auf den beiden problematischen Rechnern nicht so oft auf), aber ich fürchte, das ist ein zu grober Hack, um ihn beizubehalten, und löst das Problem nicht vollständig, und es könnte den Text vergrößern, wodurch die Schriftart... "fett" aussieht. Meine Frage ist also... gibt es eine Möglichkeit, dies zu verhindern, und diese Werte nicht in Ganzzahlen umzuwandeln? (Ich brauche die geringen Unterschiede, die Floats im Vergleich bieten). Kann ich herausfinden, welche Breiten/Höhen durch zwei teilbar sind, und die, die es nicht sind, anders behandeln? Wenn es tatsächlich ein Problem mit der Grafikkarte ist, wäre es möglich, es zu umgehen? Tut mir leid, wenn die Frage etwas unvollständig ist, ich frage nicht oft im Internet nach und habe kein Programmierstudium. Ich bin gerne bereit, jede Zeile oder jedes Stück Code zur Verfügung zu stellen, das erforderlich sein könnte.

0voto

snarf Punkte 2505

Für eine optimale Zuverlässigkeit würde ich einen Weg finden, die Brüche zu eliminieren. Ich habe nur wenig Erfahrung mit XNA und MDX, daher weiß ich nicht, ob es dafür einen guten Grund gibt, aber warum gehen Sie von der Mitte und nicht von der Ecke aus?

0voto

geofftnz Punkte 9606

Der Versuch, so etwas pixelgenau zu machen, kann in OpenGL wegen der unterschiedlichen Auflösungen, Texturfilterung usw. schwierig sein.

Sie könnten einige Dinge ausprobieren:

  • Zeichnen Sie Ihre Schrift in eine große Textur (z.B. 512x512).
  • Zeichnen Sie die Glyphen größer, als Sie sie benötigen, und verwenden Sie den Alphakanal (Transparenz).
  • Lassen Sie etwas Leerraum (4 oder 8 Pixel) um jede Glyphe herum. Wenn Sie sie direkt aneinander schieben (wie Sie es tun würden, wenn Sie eine Schriftart für die Software-Rendering zurück in die DOS-Tage zeichnen), dann Filterung machen sie ineinander bluten.
  • Sie können auch einen anderen Ansatz wählen und sie aus Liniensegmenten zusammensetzen. Das könnte bei Schriften in den von Ihnen verwendeten Maßstäben besser funktionieren.

0voto

Malte Clasen Punkte 5487

Wenn Sie Ihren Text an nicht-ganzzahligen Koordinaten zeichnen müssen, sollten Sie die Texturfilterung aktivieren. verwenden glTexParameterfv zum Einstellen GL_TEXTURE_MIN_FILTER et GL_TEXTURE_MAG_FILTER à GL_LINEAR . Ihr Text wird verschwommen sein, aber das lässt sich nicht vermeiden, ohne auf pixelgenaue (=ganzzahlige) Koordinaten zurückzugreifen.

Beachten Sie, dass Ihre 0,05 Abhilfe nichts anderes tut, als die Art und Weise zu ändern, wie die effektiven Koordinaten auf ganze Zahlen gerundet werden. Bei der Verwendung von GL_NEAREST Texturfilterung gibt es so etwas wie einen halben Pixelversatz nicht. Selbst wenn Sie diese Koordinaten angeben, werden sie vom Texturfilter für Sie gerundet. Sie schieben es einfach in die richtige Richtung mit dem zusätzlichen 0,05.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X