2016-07-09 9 views
0

Ich habe über das folgende Programm sah immer und immer und nicht finden können, warum auf dem Bildschirm nichts macht, wenn ich es laufen:LWJGL Rendering nichts

Game.java:

public class Game { 

    private int fbid, fbid2; 

    public void start(){ 
     DisplayManager.init(); 

     glViewport(0, 0, DisplayManager.SCR_WIDTH, DisplayManager.SCR_HEIGHT); 

     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     glOrtho(0, 0, DisplayManager.SCR_WIDTH, DisplayManager.SCR_HEIGHT, 1, -1); 

     glMatrixMode(GL_MODELVIEW); 

     FloatBuffer fb = BufferUtils.createFloatBuffer(6); 
     fb.put(100).put(100).put(100).put(200).put(200).put(200); 
     fb.flip(); 

     fbid = glGenBuffers(); 
     glBindBuffer(GL_ARRAY_BUFFER, fbid); 
     glBufferData(GL_ARRAY_BUFFER, fb, GL_STATIC_DRAW); 
     glBindBuffer(GL_ARRAY_BUFFER, 0); 

     FloatBuffer fb2 = BufferUtils.createFloatBuffer(9); 
     fb2.put(1).put(1).put(1).put(1).put(1).put(1).put(1).put(1).put(1); 
     fb2.flip(); 

     fbid2 = glGenBuffers(); 
     glBindBuffer(GL_ARRAY_BUFFER, fbid2); 
     glBufferData(GL_ARRAY_BUFFER, fb2, GL_STATIC_DRAW); 
     glBindBuffer(GL_ARRAY_BUFFER, 0); 

     while(!DisplayManager.shouldClose()){ 
      render(); 
     } 

     DisplayManager.destroy(); 
    } 

    public void render(){ 
     glClear(GL_COLOR_BUFFER_BIT); 
     glClearColor(0, 0, 0, 0); 

     glColor3f(1, 1, 1); 

     glEnableClientState(GL_VERTEX_ARRAY); 
     glBindBuffer(GL_ARRAY_BUFFER, fbid); 
     glVertexPointer(2, GL_FLOAT, 0, 0); 

     glEnableClientState(GL_COLOR_ARRAY); 
     glBindBuffer(GL_ARRAY_BUFFER, fbid2); 
     glColorPointer(3, GL_FLOAT, 0, 0); 

     glDrawArrays(GL_TRIANGLES, 0, 3); 

     glBindBuffer(GL_ARRAY_BUFFER, 0); 
     glDisableClientState(GL_VERTEX_ARRAY); 
     glDisableClientState(GL_COLOR_ARRAY); 

     DisplayManager.update(); 
    } 

} 

DisplayManager.java:

public class DisplayManager { 

    public static final int SCR_WIDTH = 640; 
    public static final int SCR_HEIGHT = 480; 

    public static final int FPS = 30; 

    public static void init(){ 
     try { 
      Display.setDisplayMode(new DisplayMode(SCR_WIDTH, SCR_HEIGHT)); 
      Display.setTitle("StepBattler"); 
      Display.setResizable(false); 
      Display.create(); 
     } catch (LWJGLException e) { 
      e.printStackTrace(); 
      Display.destroy(); 
      System.exit(1); 
     } 
    } 

    public static void update(){ 
     Display.update(); 
     Display.sync(FPS); 
    } 

    public static void destroy(){ 
     Display.destroy(); 
     System.exit(0); 
    } 

    public static boolean shouldClose(){ 
     return Display.isCloseRequested(); 
    } 

    public static boolean shouldResize(){ 
     return Display.wasResized(); 
    } 

} 

Wenn ich den Bildschirm laufen, bekomme ich nur ein Fenster mit schwarzen gefüllt, und ich kann nicht verstehen, warum ein weißes Dreieck wird nicht zum Fenster machen. Ich habe mich mit glClearColor() herumgesprochen, und wenn ich seine Werte ändere, kann ich die Hintergrundfarbe des Fensters ändern, aber ich kann kein weißes Dreieck im Fenster erscheinen lassen. Außerdem habe ich versucht, glBegin()...glEnd() zu verwenden, um im sofortigen Modus zu rendern, wobei keiner der Code mit Puffer darin zu tun hat, und es immer noch nichts gerendert hat. Ich bin wirklich verwirrt darüber, was fehlt mir?

Antwort

2

Die Argumente Sie glOrtho() Anruf Blick in der falschen Reihenfolge sein:

glOrtho(0, 0, DisplayManager.SCR_WIDTH, DisplayManager.SCR_HEIGHT, 1, -1); 

Die Signatur von glOrtho(), bezogen auf das man page ist:

void glOrtho(GLdouble left, GLdouble right, 
      GLdouble bottom, GLdouble top, 
      GLdouble nearVal, GLdouble farVal); 

Da Sie 0 vorbei sind für beide links und rechts würde das Ergebnis eine ungültige Projektionsmatrix sein.

Der korrekte Aufruf für Ihren Fall ist:

glOrtho(0, DisplayManager.SCR_WIDTH, 0, DisplayManager.SCR_HEIGHT, 1, -1);