# LWJGL und Text



## TimoH. (29. Jun 2011)

Hallo,

ich habe eigentlich nur eine kurze Frage. Wie stelle ich Text in LWJGL "vernünftig" dar.
Ich habe bis vor ehm ca. 30Minuten Slick-Utils genutzt, aber nun habe ich nen paar Tests gestartet um
mal andere Texturen zu rendern und siehe da, die Schrift von Slick sieht nicht mehr nach "Schrift" aus. Es scheint so als ob die Art und weise wie ich Texturen aufn Bildschirm verfrachte, sich nicht mit der "Slick-Schrift" verträgt.

Hat wer eine Idee, oder einen Vorschlag wie ich eventuell schöner Schriften anzeige

(Meine Idee war, einen "eigenen" Font als Texturen abzuspeichern und dann eine "umwandlung" vorzunehmen, die Text einliest und Texturen die den Text repräsentieren rendert)

Mfg Timo


----------



## Kr0e (29. Jun 2011)

Ich glaube, ich weiß wo dein Problem liegt, sofern wir vom selben Problem reden 

Mir ist das mal bei der FPS ANzeige von Slick aufgefallen... Beim Rendern von Texturen musst du ja bei OpenGL stets "glBindTex()" (oder so ähn.) benutzen. Nun kann es vlt bei dir sein, dass du deine Texture bindest und der Text-Render Modus dann versucht, Text mit der von dir gebundenen Textur zu zeichnen... Das geht dann natürlich shcief....

Um zu testen, ob es daran liegt:

Frag vorher nach, welche Texture grad gebunden ist und merk dir die ID. Dann binde deine Texture, rendere und danach bindest du wieder die alte Texture-Id.

Gruß,

Chris


----------



## TimoH. (29. Jun 2011)

hehe ok, werde es mal testen.

Wo wir gerade schon bei LWJGL sind. Wenn ich das Projekt compile und aufrufe muss ich ja den Pfad zu den dll mit hilfe von
-Djava.library.path übergeben: Mein Problem, er akzeptiert nur absolute Pfade, kann man das irgendwie auch mit einem relativem Pfad machen?


----------



## Kr0e (29. Jun 2011)

Nun, eigentlich sollten relative gehen...

-Djava.library.path=lib klappt bei mir... Lib wäre ein Unterordner meines Projektordners...

Aber da mich persönlich diese Angabe sowieso stört, hab ich mir einen Extraktor gebastelt, der die nativen Dateien, je nach Betriebssystem, aus einer mitgelieferten Jar extrahiert und direkt ins ausführende Verzeichnis kopiert. Dadurch entfällt die path Angabe  Und man spart sich später Probleme der User, dass iwelche Libs nicht gefunden werden...


----------



## TimoH. (29. Jun 2011)

Ok scheine einen Workaround gefunden zu haben .

Danke Kr0e 

bevor ich jetzt den Text mit Slick zeichne rufe ich einfach bei der Slick-Texture Klasse (nicht die, die ich für meine eigenen Texturen habe) folgendes auf:


```
public void renderInfo(){
        if (showInfo) {
            glEnable(GL_TEXTURE_2D);
            org.newdawn.slick.opengl.TextureImpl.bindNone();
            font.drawString(500, 500, "TEST-TEXT", Color.yellow);
            glDisable(GL_TEXTURE_2D);
        }
    }
```

So schauts jetzt aus 
Klick


----------



## Kr0e (29. Jun 2011)

Ja genau das meinte ich!

Schön zu hören =)

Im Source-Code dieser Klasse:


```
/**
     * Clear the binding of the texture
     */
    public static void bindNone() {
    	lastBind = null;
    	GL.glDisable(SGL.GL_TEXTURE_2D);
    }
```

Wenn lastBind auf null ist, bindet der nächste Aufruf von drawString wieder die korrekte Texture. Slick macht das, um Performance zu bieten. Das binden von Texturen kostet relatvi viel Zeit und man sollte dies so gut es geht vermeiden. Z.b. lieber alles auf eine Textur klatschen und dann mit Koordinaten arbeiten...

Wie du siehst, ist das glEnable/glDisable von dir nichtmal nötig. Denn bei bindNone() wirds eh deaktiviert und am Ende zu deaktivieren ist IMHO auch nicht nötig 

EDIT:

Es gibt eine Funktion, die genau für deinen Fall gemacht ist:


```
/**
     * Clear slick caching of the last bound texture so that an 
     * external texture binder can play with the context before returning 
     * control to slick.
     */
    public static void unbind() {
    	lastBind = null;
    }
```


----------

