OpenGL Textanzeige

Hallo
Ich möchte in meinem Spiel einen 2D Text anzeigen und hab keine Lust darauf das selbst zu machen, da es sehr viiiiieeel Arbeit scheint, zumal es ja in der slick-util.jar auch eine Möglichkeit gibt. Ich habe einen solchen “TrueTypeFont” erstellt und will ihn anzeigen, jedoch wird statt des Textes nur ein Balken angezeigt. Blending ist aktiviert.

Das kann viele Gründe haben, vor allem bei OpenGL kann man Fehler ganz ohne Code nur schwer feststellen. Am besten wäre natürlich eine KSKB, aber zumindest alle wichtigen Code-Teile sollten dabei sein.

Ansonsten fällt mir gerade noch ein:
[ul]
[li]Welche OpenGL Version nutzt du 3+ oder unter 3 ?
[/li][li]Wenn du 3+ nutzt : Wie sehen deine Matrizen und deine verwendeten Shader aus ?
[/li][li]ist die nur GL_BLEND aktiviert oder ist auch die Blend-Funktion via glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); richtig gesetzt ?
[/li][/ul]

MfG,
~Oneric

wie, selbst machen?
Was ist daran viiiel Arbeit?

Du lädst dir n TTF mit java.awt.Font, zeichnest die zeichen
mit swing auf n buffered image und benutzt dieses als sprite map
für die rechtecke, welche am ende deine zeichen sind…

Im KSKB funktioniert es zwar, aber der Text hat einen Hintergrund-Kasten.

import static org.lwjgl.opengl.GL11.*;

import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Font;

import javax.swing.JFrame;

import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.newdawn.slick.Color;
import org.newdawn.slick.TrueTypeFont;


public class KSKB {

	private JFrame f;

	public KSKB(){
		f = new JFrame("KSKB");
        f.setPreferredSize(new Dimension(700, 550));
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocation(900, 50);
        f.pack();
        Canvas canvas = new Canvas();
        f.add(canvas);
        try {
        Display.setParent(canvas);
        f.setVisible(true);
        Display.create();
        } catch (LWJGLException e) {
            e.printStackTrace();
        }
        Font awtFont  = new Font("Font", Font.PLAIN, 15);
        TrueTypeFont font = new TrueTypeFont(awtFont, false);
        while(!Display.isCloseRequested()){
        	glDisable(GL_DEPTH_TEST);
            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            glOrtho(0, Display.getWidth(), Display.getHeight(), 0, -1, 1);
            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();
            glEnable(GL_BLEND);
            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
            font.drawString(Display.getWidth()/2, Display.getHeight()/2, "Test", new Color(0, 255, 0));
            Display.update();
        }
        Display.destroy();
	}
	
	public static void main(String[] args){
		new KSKB();
	}
}

da ich keine ahnug hab was da was macht, kann ich nur sagen:

  • true type font selber und mit shadern schreiben
  • swing und lwjgl mixen halte ich für keine gute idee…

Ich hab das mit dem swing-Text mal probiert und es funktioniert echt gut, v. a. weil man ja die Textur mit dem String drauf einfach strecken und skalieren kann. Wiso ist das keine gute Idee ?

Naja… Wenn du das mit mymaksimus Methode machst und auch Fonts mit ungleichmäßigen Metriken verwenden willst, musst du diese Metriken auch in einer Tabelle charToMetric abspeichern und die Flächen, die du damit Texturierst dann natürlich auch entsprechend groß machen. Ich mach das zeitweilig auch so und speichere die Bitmaps in einer Fontgröße von 24 oder 48, damit sie auch vergrößert noch einigermaßen rund aussehen. Die Grafiken ganzer Texte speichern funktioniert natürlich auch, aber diese Idee finde ich nicht besonders toll. 4 Vertices pro Buchstabenfläche verbrauchen weit weniger Speicher als n mal der selbe Buchstabe als Grafik.

Swing ist wohl wegen der portabilität des Quellcodes von z.B. PC zu Android keine gute Idee, ansonsten sehe ich da keine Probleme. MMn fehlen Font- und Text-Methoden in OpenGL einfach. Solche wie in WGL wären nicht schlecht - also useBitmpapFont und useOutlineFont. Mit useOutlineFont funktioniert sogar 3D-Text.