2014-01-30 5 views
0

Поскольку рендеринг с треугольниками быстрее, чем рендеринг с квадроциклами, я решил разделить свои 6 четырехгранников на 12 полных треугольников. Часть, на которую я застрял, заключается в том, что я понятия не имею, как применить квадратную текстуру к поверхности треугольника. Снимок ниже - моя попытка, но это довольно странно. Может ли кто-нибудь объяснить, что происходит, и показать мне, как я буду исправлять эту проблему?LWJGL VBO Треугольные координаты текстуры не работают

Скриншот: http://i.snag.gy/2ZenI.jpg

BlockFace класс:

public class BlockFace { 
    private final int amountOfVertices = 3; 
    private final int vertexSize = 3; 
    private final int textureSize = 2; 
    private final int amountOfFaces = 2; 

    private int vbo; // vertices 
    private int tbo; // texture coordinates 

    public BlockFace(float[] vertices) { 
     FloatBuffer vertexData = BufferUtils.createFloatBuffer(amountOfVertices * vertexSize * amountOfFaces); 
     vertexData.put(vertices); 
     vertexData.flip(); 

     FloatBuffer textureData = BufferUtils.createFloatBuffer(4 * textureSize * amountOfFaces); 
     textureData.put(new float[] { 
       0, 0, 
       1, 0, 
       1, 1, 
       0, 1, 

       0, 0, 
       1, 0, 
       1, 1, 
       0, 1 
     }); 
     textureData.flip(); 

     vbo = glGenBuffers(); 
     glBindBuffer(GL_ARRAY_BUFFER, vbo); 
     glBufferData(GL_ARRAY_BUFFER, vertexData, GL_STATIC_DRAW); 
     glBindBuffer(GL_ARRAY_BUFFER, 0); 

     tbo = glGenBuffers(); 
     glBindBuffer(GL_ARRAY_BUFFER, tbo); 
     glBufferData(GL_ARRAY_BUFFER, textureData, GL_STATIC_DRAW); 
     glBindBuffer(GL_ARRAY_BUFFER, 0); 
    } 

    public void draw(Texture texture) { 
     texture.bind(); 

     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

     glBindBuffer(GL_ARRAY_BUFFER, vbo); 
     glVertexPointer(vertexSize, GL_FLOAT, 0, 0L); 

     glBindBuffer(GL_ARRAY_BUFFER, tbo); 
     glTexCoordPointer(textureSize, GL_FLOAT, 0, 0L); 

     glEnableClientState(GL_VERTEX_ARRAY); 
     glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
     glDrawArrays(GL_TRIANGLES, 0, amountOfVertices * 2); 
     glDisableClientState(GL_VERTEX_ARRAY); 
     glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
    } 
} 

BlockRenderer класс:

public class BlockRenderer { 
    private BlockFace topBlockFace; 
    private BlockFace bottomBlockFace; 
    private BlockFace frontBlockFace; 
    private BlockFace backBlockFace; 
    private BlockFace leftBlockFace; 
    private BlockFace rightBlockFace; 

    public BlockRenderer() { 
     topBlockFace = new BlockFace(new float[] { 
      0, 1, 0, 
      1, 1, 0, 
      0, 1, 1, 

      1, 1, 1, 
      1, 1, 0, 
      0, 1, 1 
     }); 
     bottomBlockFace = new BlockFace(new float[] { 
      0, 0, 0, 
      1, 0, 0, 
      0, 0, 1, 

      1, 0, 1, 
      1, 0, 0, 
      0, 0, 1 
     }); 
     frontBlockFace = new BlockFace(new float[] { 
      0, 0, 1, 
      0, 1, 1, 
      1, 1, 1, 

      0, 0, 1, 
      1, 0, 1, 
      1, 1, 1 
     }); 
     backBlockFace = new BlockFace(new float[] { 
      0, 0, 0, 
      0, 1, 0, 
      1, 1, 0, 

      0, 0, 0, 
      1, 0, 0, 
      1, 1, 0 
     }); 
     leftBlockFace = new BlockFace(new float[] { 
      0, 1, 0, 
      0, 1, 1, 
      0, 0, 1, 

      0, 1, 0, 
      0, 0, 0, 
      0, 0, 1 
     }); 
     rightBlockFace = new BlockFace(new float[] { 
      1, 1, 0, 
      1, 1, 1, 
      1, 0, 1, 

      1, 1, 0, 
      1, 0, 0, 
      1, 0, 1 
     }); 
    } 

    public void renderBlock(Block block, float x, float y, float z) { 
     glPushMatrix(); 
     glTranslatef(x, y, z); 

     topBlockFace.draw(block.getTexture()); 
     bottomBlockFace.draw(block.getTexture()); 
     frontBlockFace.draw(block.getTexture()); 
     backBlockFace.draw(block.getTexture()); 
     leftBlockFace.draw(block.getTexture()); 
     rightBlockFace.draw(block.getTexture()); 

     glPopMatrix(); 
    } 
} 

ответ

0

Если разделить ваши вершины на треугольники, вы должны разделить координаты текстуры на треугольники тоже. Это означает, что вам нужно 6 текстурных координат на лице, как у вас есть 6 вершин на лице.

Для примера вам нужно изменить на:

FloatBuffer textureData = BufferUtils.createFloatBuffer(amountOfVertices * textureSize * amountOfFaces); 
for(int i = 0; i < amountOfFaces; i++) { 
    textureData.put(new float[] { 
      0, 0, 
      1, 0, 
      0, 1, 

      1, 1, 
      1, 0, 
      0, 1 
    }); 
} 
textureData.flip(); 

Кроме того, я увидел, что один из ваших треугольников в квад определяются по часовой стрелке, в то время как другие определяются против часовой стрелки. Если вы используете cull-face, вы увидите только один из треугольников.

Смежные вопросы