2014-01-30 17 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,你只会看到其中一个三角形。