Witam. Stworzyłem voxel engine do generowania bloków w 3d używając LWJGL. Coś jak minecraft.
Problem z nim jest taki, że nic nie wyświetla. Okno pozostaje cały czas czarne.

Klasa main:

Tworzenie okna:

               Display.setFullscreen(false);
		DisplayMode d[] = Display.getAvailableDisplayModes();
		Display.setDisplayMode(displayMode);
		Display.setTitle("EPQ Voxel engine");
		Display.setVSyncEnabled(true);
		Display.create();

Inicializacja GL:

                GL11.glEnable(GL11.GL_TEXTURE_2D);
		GL11.glShadeModel(GL11.GL_SMOOTH);
		GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
		GL11.glClearDepth(1.0);
		GL11.glEnable(GL11.GL_DEPTH_TEST);
		GL11.glDepthFunc(GL11.GL_LEQUAL);

		GL11.glMatrixMode(GL11.GL_PROJECTION);
		GL11.glLoadIdentity();

		GLU.gluPerspective(45.0f, (float) displayMode.getWidth() / (float) displayMode.getHeight(), 0.1f, 100.0f);

		GL11.glMatrixMode(GL11.GL_MODELVIEW);
		GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST);
		
		GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);
	        GL11.glEnableClientState(GL11.GL_COLOR_ARRAY);

Pętla renderowania:

                Chunk ch = new Chunk(0,0,0);
		while (!Display.isCloseRequested()) {
			try {
				ch.render();
				Display.update();
				Display.sync(60);
			} catch (Exception e) {

			}
		}
                Display.destroy();
		Mouse.destroy();
		Keyboard.destroy();

Klasa Chunk:

import me.przemovi.ngine3.map.Block.BlockType;

public class Chunk
{
   public static final int CHUNK_WIDTH = 16;
   public static final int CHUNK_HEIGHT = 16;
   public static final int CHUNK_LENGTH = 16;
   private Block[][][] blocks;
   private int vboVertexHandle;
   private int vboColorHandle;
   private int startX, startY, startZ;

   public Chunk(int x, int y, int z)
   {
      startX = x;
      startY = y;
      startZ = z;
      
      blocks = new Block[CHUNK_WIDTH][CHUNK_HEIGHT][CHUNK_LENGTH];

      for(int xx = 0; xx < CHUNK_WIDTH; xx++)
      {
         for(int yy = 0; yy < CHUNK_HEIGHT; yy++)
         {
            for(int zz = 0; zz < CHUNK_WIDTH; zz++)
            {
               //blocks[xx][yy][zz] = Block.stone;
            	blocks[xx][yy][zz] = new Block(BlockType.BlockType_Stone);
            }
         }
      }

      vboColorHandle = GL15.glGenBuffers();
      vboVertexHandle = GL15.glGenBuffers();
      this.rebuildMesh(startX, startY, startZ);
   }

   private void rebuildMesh(int startX2, int startY2, int startZ2)
   {
      vboColorHandle = GL15.glGenBuffers();
      vboVertexHandle = GL15.glGenBuffers();
      FloatBuffer vertexPositionData = BufferUtils.createFloatBuffer((CHUNK_WIDTH * CHUNK_LENGTH * CHUNK_HEIGHT) * 6 * 12);
      FloatBuffer vertexColorData = BufferUtils.createFloatBuffer((CHUNK_WIDTH * CHUNK_LENGTH * CHUNK_HEIGHT) * 6 * 12);
      for(int xx = 0; xx < CHUNK_WIDTH; xx++)
      {
         for(int yy = 0; yy < CHUNK_WIDTH; yy++)
         {
            for(int zz = 0; zz < CHUNK_WIDTH; zz++)
            {
               if(blocks[xx][yy][zz] != null)
               {
                  vertexPositionData.put(makeCube((float) startX + xx, (float) startY + yy, (float) startZ + zz));
                  vertexColorData.put(makeCubeVertexCol(getCubeColor(blocks[xx][yy][zz])));
               }
            }
         }
      }
      vertexColorData.flip();
      vertexPositionData.flip();
      GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboVertexHandle);
      GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertexPositionData, GL15.GL_STATIC_DRAW);
      GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboColorHandle);
      GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertexColorData, GL15.GL_STATIC_DRAW);
      GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
   }

   private float[] makeCubeVertexCol(float[] cubeColorData)
   {
      float[] cubeColors = new float[cubeColorData.length * 4 * 6];
      for(int i = 0; i < cubeColors.length; i++)
      {
         cubeColors[i] = cubeColorData[i % cubeColorData.length];
      }
      return cubeColors;
   }

   private float[] getCubeColor(Block block)
   {
      return new float[]
      { 1, 0.5f, 1 };
   }

   private float[] makeCube(float x, float y, float z)
   {
      int offset = Block.SIZE / 2;
      return new float[]
      { x + offset, y + offset, z, x - offset, y + offset, z, x - offset, y + offset, z - Block.SIZE, x + offset, y + offset, z - Block.SIZE, x + offset, y - offset, z - Block.SIZE, x - offset, y - offset, z - Block.SIZE, x - offset, y - offset, z, x + offset, y - offset, z, x + offset, y + offset, z - Block.SIZE, x - offset, y + offset, z - Block.SIZE, x - offset, y - offset, z - Block.SIZE, x + offset, y - offset, z - Block.SIZE, x + offset, y - offset, z, x - offset, y - offset, z, x - offset, y + offset, z, x + offset, y + offset, z, x - offset, y + offset, z - Block.SIZE, x - offset, y + offset, z, x - offset, y - offset, z, x - offset, y - offset, z - Block.SIZE, x + offset, y + offset, z, x + offset, y + offset, z - Block.SIZE, x + offset, y - offset, z - Block.SIZE, x + offset, y - offset, z };
   }

   private float[] getNormalVector()
   {
      return new float[]
      { 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, };
   }

   public void tick()
   {

   }

   public void render()
   {
      GL11.glPushMatrix();
      GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboVertexHandle);
      GL11.glVertexPointer(3, GL11.GL_FLOAT, 0, 0L);
      GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboColorHandle);
      GL11.glColorPointer(3, GL11.GL_FLOAT, 0, 0L);
      GL11.glDrawArrays(GL11.GL_QUADS, 0, CHUNK_WIDTH * CHUNK_HEIGHT * CHUNK_LENGTH * 24);
      GL11.glPopMatrix();
   }
}

Klasa block:

public class Block {
	private BlockType Type;
	private boolean Visible=true;
	public static int SIZE = 1;
	public enum BlockType {
		BlockType_Default(0),
		BlockType_Grass(1),
		BlockType_Dirt(2),
		BlockType_Water(3), 
		BlockType_Stone(4),
		BlockType_Wood(5),
		BlockType_Sand(6),
		BlockType_NumTypes(7);
		private int BlockID;
		BlockType(int i) {
			BlockID=i;
		}
		public int GetID(){
			return BlockID;
		}
	}
	public Block(BlockType type){
		Type= type;
	}


	public int GetID(){
		return Type.GetID();
	}


	public boolean isVisible() {
		return Visible;
	}


	public void setVisible(boolean visible) {
		Visible = visible;
	}
}