2012-02-11 26 views
1

我創建了一個簡單的腳本,創建一個perlin噪聲數組並將其呈現在屏幕上。 perlin代碼是健全的,但渲染代碼不是。屏幕只顯示白色,屏幕上完全沒有東西。OpenGL渲染網格和旋轉腳本不工作?

public class MainClass { 
    double lastFPS = 0; 
    double fps = 0; 
    int seed = 0; 
    float rotation = 0; 
    float[][]noise = new float[0][0]; 
    float[]cameraPos = {0f,0f,0f}; 

    public static void main(String[] args) 
    { 
     MainClass mainClass = new MainClass(); 
     Random r = new Random(); 
     mainClass.seed = r.nextInt(); 
     mainClass.launchScreen(); 
    } 

    float lerp(float x0, float x1, float alpha) 
    { 
     return x0 * (1 - alpha) + alpha * x1; 
    } 

    /** 
    * Calculate the FPS and set it in the title bar 
    */ 
    public void updateFPS() { 
     if (getTime() - lastFPS > 1000) { 
      Display.setTitle("FPS: " + fps + "; Seed: " + seed); 
      fps = 0; //reset the FPS counter 
      lastFPS += 1000; //add one second 
     } 
     fps++; 
    } 

    public void launchScreen() 
    { 
     try { 
      Display.setDisplayMode(new DisplayMode(800,600)); 
      Display.create(); 
     } catch (LWJGLException e) { 
      e.printStackTrace(); 
      System.exit(0); 
     } 

     lastFPS = getTime(); 
     float rot = 0.0f; 
     PerlinGen pg = new PerlinGen(); 
     noise = pg.GeneratePerlinNoise(pg.GenerateWhiteNoise(100, 100, seed), 5); //Get perlin noise array, returns float values from 0.0 to 1.0. 
     System.out.println("Noise length is: (" + noise.length + "," + noise[0].length + ")"); 

     // init OpenGL here 
     GL11.glMatrixMode(GL11.GL_PROJECTION); 
     GL11.glLoadIdentity(); 
     GL11.glOrtho(0, 800, 0, 600, 1, -1); 
     GL11.glMatrixMode(GL11.GL_MODELVIEW); 

     GL11.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE); //Wireframe 
     //GL11.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL); //Normal 

     while (!Display.isCloseRequested()) { 

      updateFPS(); 

      // render OpenGL here 
      GL11.glClearColor(1,1,1,1); 
      GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); 

      // draw quad 
      int centerX = noise.length*5; 
      int centerY = 5; 
      int centerZ = noise[0].length*-5; 
      GLU.gluLookAt(centerX*2,500, centerZ*2, /* look from camera XYZ */ 
        centerX, centerY, centerZ, /* look at the origin */ 
        0, 1, 0); /* positive Y up vector */ 

      drawNoiseGrid(rot); 
      rot += 0.05f; 

      Display.update(); 
     } 

     Display.destroy(); 
    } 

    public void drawNoiseGrid(float r) 
    { 
     rotation = r; 
     GL11.glColor3f(0f,0f,0.0f); 

     for(int x=0;x<noise.length-1;x++) 
     { 
      for(int y=0;y<noise[x].length-1;y++) 
      { 
       GL11.glBegin(GL11.GL_QUADS); 
       GL11.glVertex3f(10*x,noise[x][y]*10,-10*y);//topleft 
       GL11.glVertex3f(10*(x+1),noise[x+1][y]*10,-10*y);//topright 
       GL11.glVertex3f(10*x,noise[x][y+1]*10,-10*(y+1));//bottomleft 
       GL11.glVertex3f(10*(x+1),noise[x+1][y+1]*10,-10*(y+1));//bottomright 
       GL11.glEnd(); 
      } 
     } 
    } 

    /** 
    * Get the time in milliseconds 
    * 
    * @return The system time in milliseconds 
    */ 
    public long getTime() { 
     return (Sys.getTime() * 1000)/Sys.getTimerResolution(); 
    } 
} 

回答

0

你必須每個四邊形結構是這樣的:

//topleft 
//topright 
//bottomleft 
//bottomright 

如果序列是你想提交某種愚蠢的「Z」形多邊形GL_QUADS準確。

試試這個順序來代替:

//bottomleft 
//bottomright 
//topright 
//topleft 

而且,你不需要glBegin()每四/ glEnd()所以搬完到環外的一個小的性能提升:

GL11.glBegin(GL11.GL_QUADS); 
for(int x=0;x<noise.length-1;x++) 
{ 
    for(int y=0;y<noise[x].length-1;y++) 
    { 
     GL11.glVertex3f(10*x,noise[x][y+1]*10,-10*(y+1));//bottomleft 
     GL11.glVertex3f(10*(x+1),noise[x+1][y+1]*10,-10*(y+1));//bottomright 
     GL11.glVertex3f(10*(x+1),noise[x+1][y]*10,-10*y);//topright 
     GL11.glVertex3f(10*x,noise[x][y]*10,-10*y);//topleft 
    } 
} 
GL11.glEnd(); 
+0

謝謝,但'glLookAt'似乎也有問題。這也正確嗎? – Flafla2 2012-02-12 01:55:41