Text a 2D grafika

Tutoriál nerozšiřuje předchozí. Ukazuje, jakým způsobem je možné umístit libovolný nápis do OpenGL okna a vytvoření otexturovaného čtverce. Dvourozměrná grafika se často nazývá sprite. Uvedený postup je možné použít na vytvoření nápovědy a podobně. Klientská třída Lesson je stále stejná, pouze dojde k několika úpravám ve třídě Renderer.

Po spuštění níže uvedeného kódu uvidíte okno, jako je na obrázku.

Text a otexturovaný čtverec
Text a otexturovaný čtverec

Třída Renderer

Oproti předchozí kapitole byly některé metody odstraněny, protože nejsou na správnou funkci textu a 2D grafiky potřeba. Kompletní zdrojový kód je ke stažení.

Počet atributů třídy se snížil, ale používáme novou třídu GLUT, která obsahuje potřebné metody pro práci s textem. Všimněte si, že se změnil název souboru s texturou.

private final String textureFile = "lesson05/textures/picture.jpg";

private final int texturesCount = 1;

private int[] texture = new int[texturesCount];

 

private GLU glu = new GLU();

private GLUT glut = new GLUT();

private GL gl;

Pro obyčejné psaní textu do okna nejsou některé řádky nezbytně nutné. Vzhledem k tomu, že v budoucnu se bude pravděpodobně text psát přes vyrenderovanou scénu, je vhodné tyto postupy uvést. Na začátku přepneme na matici MODELVIEW a uložíme její stávající podobu, to samé uděláme s maticí PROJECTION. Obě matice nastavíme na jednotkové. Pak nastavíme aktuální pohled a uložíme všechny potřebné OpenGL vlastnosti, které budeme později potřebovat. Vypneme světla a testováni hloubky při vykreslování.

public void display(GLAutoDrawable gLDrawable)

{

gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);

gl.glLoadIdentity();

 

gl.glMatrixMode(GL.GL_MODELVIEW);

gl.glPushMatrix();

gl.glLoadIdentity();

gl.glMatrixMode(GL.GL_PROJECTION);

gl.glPushMatrix();

gl.glLoadIdentity();

 

gl.glViewport(0, 0, gLDrawable.getWidth(), gLDrawable.getHeight());

 

gl.glPushAttrib(GL.GL_ENABLE_BIT);

 

gl.glDisable(GL.GL_LIGHTING);

gl.glDisable(GL.GL_DEPTH_TEST);

Uložíme aktuální pohledovou matici (VIEWPORT) a nastavíme pravoúhlou projekci. Následuje zapnutí textur, nastavení textury kterou chceme používat, nastavení barvy čtverce a vykreslení čtverce obdobným způsobem jako ve třetí lekci. Pouze s tím rozdílem, že není udána souřadnice Z a používáme dvousložkové vektory.

IntBuffer viewPort = BufferUtil.newIntBuffer(4);

gl.glGetIntegerv(GL.GL_VIEWPORT, viewPort);

glu.gluOrtho2D(0, viewPort.get(2), viewPort.get(3), 0);

 

gl.glEnable(GL.GL_TEXTURE_2D);

 

gl.glBindTexture(GL.GL_TEXTURE_2D, texture[0]);

 

gl.glColor3f(1, 1, 1);

gl.glBegin(GL.GL_QUADS);

 

gl.glTexCoord2f(0, 0);

gl.glVertex2f(10, 250);

gl.glTexCoord2f(1, 0);

gl.glVertex2f(250, 250);

gl.glTexCoord2f(1, 1);

gl.glVertex2f(250, 50);

gl.glTexCoord2f(0, 1);

gl.glVertex2f(10,50);

 

gl.glEnd();

Vypneme textury, nastavíme barvu na žlutou. Pak nastavíme pozici, kam chceme, aby se text zobrazoval a text vypíšeme fontem Helvetica. ®ádný z fontů nepodporuje plně češtinu s diakritikou. Řezy fontů a jejich velikosti jsou omezeny, viz tabulka. Nakonec obnovíme původní nastavení všech matic.

gl.glDisable(GL.GL_TEXTURE_2D);

 

gl.glColor3f(1, 1, 0);

 

gl.glRasterPos2i(20, 40);

glut.glutBitmapString(GLUT.BITMAP_HELVETICA_18, "Lekce 5");

 

gl.glPopAttrib();

 

gl.glPopMatrix();

gl.glMatrixMode(GL.GL_MODELVIEW);

gl.glPopMatrix();

}

Řez písma Skutečný vzhled
BITMAP_8_BY_13 BITMAP_8_BY_13
BITMAP_9_BY_15 BITMAP_9_BY_15
BITMAP_HELVETICA_10 BITMAP_HELVETICA_10
BITMAP_HELVETICA_12 BITMAP_HELVETICA_12
BITMAP_HELVETICA_18 BITMAP_HELVETICA_18
BITMAP_TIMES_ROMAN_10 BITMAP_TIMES_ROMAN_10
BITMAP_TIMES_ROMAN_24 BITMAP_TIMES_ROMAN_24