Search code examples
openglfontslwjglvertices

Quad drawing with GL_TRIANGLE_STRIP


I'm trying to draw a string in OpenGL with LWJGL from a texture atlas containing all chars next to another.

Now I'm adding for each char three vertices to the mesh, which is going to be rendered by

GL11.glDrawArrays(GL11.GL_TRIANGLE_STRIP, 0, text.getModel().getRawModel().getVertexCount());

For example I'm tyring to render the string "Thomas", that end's up as the following (with added offset to see the problem better):

Render of Thomas

As you can see, there is a strange "quad" between every char and i don't know why :-( I think that I'm adding to many vertices per char, but i got no idea to do it better...

Vertices (2D):

-0.3333333, 0.5875, 
-0.24800003, 0.5875, 
-0.3333333, 0.25, 
-0.24800003, 0.25, 

-0.11466664, 0.5875, 
-0.029333353, 0.5875, 
-0.11466664, 0.25, 
-0.029333353, 0.25, 

0.10399997, 0.5875, 
0.18933332, 0.5875, 
0.10399997, 0.25, 
0.18933332, 0.25, 

0.32266665, 0.5875, 
0.408, 0.5875, 
0.32266665, 0.25, 
0.408, 0.25, 

0.5413333, 0.5875, 
0.62666667, 0.5875, 
0.5413333, 0.25, 
0.62666667, 0.25, 

0.76, 0.5875, 
0.84533334, 0.5875, 
0.76, 0.25, 
0.84533334, 0.25,

Texture Coords (2D):

0.23318386, 1.0, 
0.23766816, 1.0, 
0.23318386, 0.0, 
0.23766816, 0.0, 

0.32286996, 1.0, 
0.32735425, 1.0, 
0.32286996, 0.0, 
0.32735425, 0.0, 

0.3542601, 1.0, 
0.35874438, 1.0, 
0.3542601, 0.0, 
0.35874438, 0.0, 

0.34529147, 1.0, 
0.3497758, 1.0, 
0.34529147, 0.0, 
0.3497758, 0.0, 

0.29147983, 1.0, 
0.29596412, 1.0, 
0.29147983, 0.0, 
0.29596412, 0.0, 

0.3721973, 1.0, 
0.37668163, 1.0, 
0.3721973, 0.0, 
0.37668163, 0.0 

Solution

  • Looking at how you laid out your vertices, it looks like GL_TRIANGLE_STRIP is not going to work. Let's label your vertices with the numbers 0 through 24. The triangle strip topology will draw triangles like this:

    draw triangle 0 1 2
    draw triangle 1 2 3
    draw triangle 2 3 4
    ...
    draw triangle 20 21 22
    draw triangle 21 22 23
    

    What you probably want is this:

    draw triangle 0 1 2
    draw triangle 1 2 3
    
    draw triangle 4 5 6
    draw triangle 5 6 7
    
    draw triangle 8 9 10
    draw triangle 9 10 11
    
    ...
    ...
    
    draw triangle 20 21 22
    draw triangle 21 22 23
    

    This can be accomplished with the GL_TRIANGLES topology and using an indices buffer like this:

    [ 0 1 2 1 2 3 4 5 6 5 6 7 ... 20 21 22 21 22 23 ]