2014-06-10 146 views
0

我正在使用VBO为我的游戏渲染所有我的多维数据集(因为会有很多它们),我希望它们都具有纹理。当我运行我的代码时,立方体没有纹理(相反,它看起来有点红,因为我的纹理是砖墙),只有当我非常接近立方体时,纹理才显示出来(并且位置错误,比立方体小得多本身),是的,纹理是2(64x64)的力量,所以这不是问题。无法正确渲染的纹理LWJGL

渲染

package engine; 

import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; 
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; 
import static org.lwjgl.opengl.GL11.GL_DEPTH_TEST; 
import static org.lwjgl.opengl.GL11.glClear; 
import static org.lwjgl.opengl.GL11.glEnable; 
import static org.lwjgl.opengl.GL15.GL_ARRAY_BUFFER; 
import static org.lwjgl.opengl.GL15.GL_STATIC_DRAW; 
import static org.lwjgl.opengl.GL15.glBindBuffer; 
import static org.lwjgl.opengl.GL15.glBufferData; 
import static org.lwjgl.opengl.GL15.glGenBuffers; 

import java.io.File; 
import java.io.FileInputStream; 
import java.nio.FloatBuffer; 
import java.util.ArrayList; 

import org.lwjgl.BufferUtils; 
import org.lwjgl.opengl.GL11; 
import org.lwjgl.util.vector.Vector3f; 
import org.newdawn.slick.opengl.Texture; 
import org.newdawn.slick.opengl.TextureLoader; 

public class Render { 

    private int amountOfVerts; 
    private int vertexSize = 3; 
    private int colorSize = 3; 
    private int textureSize = 2; 
    private FloatBuffer vertData, colorData, textureData; 
    private int handle, colorHandle, textureHandle; 
    private ArrayList<Cube> cubes = new ArrayList<Cube>(); 
    private Texture brick; 

    public Render() { 
     try{ 
      brick = TextureLoader.getTexture("BMP", new FileInputStream(new File("brick.bmp"))); 
     } 
     catch (Exception e){ 
      e.printStackTrace(); 
     } 
     glEnable(GL11.GL_TEXTURE_2D); 
     glEnable(GL_DEPTH_TEST); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

     addCube(new Cube(new Vector3f(0, 0, 0))); 

     amountOfVerts = cubes.size() * 24; 
     vertData = BufferUtils.createFloatBuffer(amountOfVerts * vertexSize); 
     createCubeArray(); 
     vertData.flip(); 

     /* 
     * colorData = BufferUtils.createFloatBuffer(amountOfVerts * 
     * colorSize); float[] color = new float[amountOfVerts * 
     * colorSize]; Arrays.fill(color, 1f); colorData.put(color); 
     * colorData.flip(); 
     */ 

     textureData = BufferUtils.createFloatBuffer(amountOfVerts * textureSize); 
     createTextureArray();; 
     textureData.flip(); 

     handle = glGenBuffers(); 
     glBindBuffer(GL_ARRAY_BUFFER, handle); // sets the current 
     glBufferData(GL_ARRAY_BUFFER, vertData, GL_STATIC_DRAW); // fills 
     glBindBuffer(GL_ARRAY_BUFFER, 0); // unbinds 

     /* 
     colorHandle = glGenBuffers(); 
     glBindBuffer(GL_ARRAY_BUFFER, colorHandle); // sets the current 
     glBufferData(GL_ARRAY_BUFFER, colorData, GL_STATIC_DRAW); // fills 
     glBindBuffer(GL_ARRAY_BUFFER, 0); // unbinds 
     */ 

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

     GL11.glBindTexture(GL11.GL_TEXTURE_2D, brick.getTextureID()); 
    } 

    public void createCubeArray() { 
     for (int i = 0; i < cubes.size(); i++) { 
      Cube c = cubes.get(i); 
      storeVertexData(c.getData()); 
     } 
    } 

    public void createTextureArray(){ 
     for (int i = 0; i < cubes.size(); i++) { 
      Cube c = cubes.get(i); 
      storeTextureData(c.getTextureData()); 
     } 
    } 

    public void storeVertexData(float[] data) { 
     vertData.put(data); 
    } 

    public void storeTextureData(float[] data) { 
     textureData.put(data); 
    } 

public void render() { 
     glEnable(GL_DEPTH_TEST); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

     glBindBuffer(GL_ARRAY_BUFFER, handle); 
     GL11.glVertexPointer(vertexSize, GL11.GL_FLOAT, 0, 0L); 

     /* 
     glBindBuffer(GL_ARRAY_BUFFER, colorHandle); 
     GL11.glColorPointer(colorSize, GL11.GL_FLOAT, 0, 0L); 
     */ 

     glBindBuffer(GL_ARRAY_BUFFER, textureHandle); 
     GL11.glTexCoordPointer(textureSize, GL11.GL_FLOAT, 0, 0L); 

     GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY); 
     GL11.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY); 
     GL11.glDrawArrays(GL11.GL_QUADS, 0, amountOfVerts); 
     GL11.glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY); 
     GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY); 



} 

立方类

package engine; 

import org.lwjgl.util.vector.Vector3f; 

public class Cube { 

    private Vector3f pos = null; 
    private float cubeSize = 100f; 

    public Cube(Vector3f pos) { 
     this.pos = pos; 
    } 

    public float[] getData(){ 
     return new float[] { pos.x,pos.y,pos.z, 
        pos.x + cubeSize,pos.y,pos.z, 
        pos.x + cubeSize,pos.y + cubeSize,pos.z, 
        pos.x,pos.y + cubeSize,pos.z, 

        pos.x,pos.y,pos.z + cubeSize, 
        pos.x + cubeSize,pos.y,pos.z + cubeSize, 
        pos.x + cubeSize,pos.y + cubeSize,pos.z + cubeSize, 
        pos.x,pos.y + cubeSize,pos.z + cubeSize, 

        pos.x,pos.y,pos.z, 
        pos.x,pos.y,pos.z + cubeSize, 
        pos.x,pos.y + cubeSize,pos.z + cubeSize, 
        pos.x,pos.y + cubeSize,pos.z, 

        pos.x + cubeSize,pos.y,pos.z, 
        pos.x + cubeSize,pos.y,pos.z + cubeSize, 
        pos.x + cubeSize,pos.y + cubeSize,pos.z + cubeSize, 
        pos.x + cubeSize,pos.y + cubeSize,pos.z, 

        pos.x,pos.y,pos.z, 
        pos.x,pos.y,pos.z + cubeSize, 
        pos.x + cubeSize,pos.y,pos.z + cubeSize, 
        pos.x + cubeSize,pos.y,pos.z, 

        pos.x,pos.y + cubeSize,pos.z, 
        pos.x,pos.y + cubeSize,pos.z + cubeSize, 
        pos.x + cubeSize,pos.y + cubeSize,pos.z + cubeSize, 
        pos.x + cubeSize,pos.y + cubeSize,pos.z, 
       }; 
    } 

    public float[] getTextureData(){ 
     return new float[]{0,0, 1,0, 1,1, 0,1}; 
    } 

} 

回答

2

您没有远远不够纹理坐标。由于每个立方体使用24个顶点,因此还需要24组纹理坐标。每组纹理坐标有2个浮点数,getTextureData()需要返回一个由48个浮点数组成的数组。在你发布的代码中,它返回一个只有8个浮点数的数组。

当使用顶点数组/缓冲区来渲染几何时,对于所有属性总是需要相同的计数。在这种情况下,24个位置,24组纹理坐标,24种颜色(如果你想使用颜色)等等。