2016-10-15 170 views
0

我們應該使用LWJGL 2.9.3創建一個顯示線框對象的簡單應用程序。我創建了一個基於http://www.glprogramming.com/red/chapter01.html的第一個示例代碼的測試課程。我最終得到的是一個程序,該程序在短時間內閃爍白色方塊,然後消失。我不確定我做錯了什麼。相同的openGL調用在LWJGL中產生不同的結果

下面是測試代碼:

package Test.LWJGL; 

import org.lwjgl.input.Keyboard; 
import org.lwjgl.input.Mouse; 
import org.lwjgl.opengl.Display; 
import org.lwjgl.opengl.DisplayMode; 

import static CS355.LWJGL.LWJGLSandbox.DISPLAY_HEIGHT; 
import static CS355.LWJGL.LWJGLSandbox.DISPLAY_WIDTH; 
import static org.lwjgl.opengl.GL11.*; 
import static org.lwjgl.opengl.GL11.glFlush; 


public class LWJGLTest { 
    public static void render() { 
     glClear(GL_COLOR_BUFFER_BIT); 
     glColor3f(1.0f, 1.0f, 1.0f); 
     glOrtho(0, 1.0, 0.0, 1.0, -1.0, 1.0); 
     glBegin(GL_POLYGON); 
      glVertex3f(0.25f, 0.25f, 0.0f); 
      glVertex3f(0.75f, 0.25f, 0.0f); 
      glVertex3f(0.75f, 0.75f, 0.0f); 
      glVertex3f(0.25f, 0.75f, 0.0f); 
     glEnd(); 
     glFlush(); 
    } 

    public static void main(String[] args) { 
     try { 
      Display.setDisplayMode(new DisplayMode(DISPLAY_WIDTH,DISPLAY_HEIGHT)); 
      Display.setFullscreen(false); 
      Display.create(); 

      glClearColor(0.0f,0.0f,0.0f,0.0f); 

      while(!Display.isCloseRequested() && !Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) { 
       if(Display.isVisible()) { 
        render(); 
       } 
       else { 
        if(Display.isDirty()) { 
         render(); 
        } 
        try { 
         Thread.sleep(100); 
        } 
        catch(InterruptedException ex) {} 
       } 
       Display.update(); 
       Display.sync(60); 
      } 
     } 
     catch(Exception ex) { 
      ex.printStackTrace(); 
     } 
     finally { 
      Mouse.destroy(); 
      Keyboard.destroy(); 
      Display.destroy(); 
     } 
    } 
} 

回答

1

OpenGL是一個狀態機。這意味着,您可以設置很多狀態,並以某種明確定義的方式影響最終渲染結果。這些狀態是從來沒有自動重置,他們只是保持你設置他們,直到你改變他們。沒有像「幀」或「場景對象」這樣的東西,只是一個狀態設置或繪圖命令流。

OpenGL的矩陣堆棧也只是一個狀態。函數glOrtho乘以當前選定矩陣堆棧的當前頂部元素與該正交矩陣,並將用該結果替換頂部元素。

假設正交矩陣稱爲O。最初,GL的所有矩陣都是相同的。因此,當您第一次致電render時,您將獲得:M = M * O = I * O = O。但是,第二次,您將獲得M = M * O = O * O。等等。

你必須在幀的開始明確地重置矩陣回身份:

glLoadIdentity(); 
glOrtho(...); 

你應該知道,你正在使用的代碼是不是很好。它使用投影矩陣的MODELVIEW堆棧,這意味着要去GL_PROJECTION。但在您嘗試瞭解該員工之前,請注意,自從十年以來,所有這些在GL中完全被棄用。現代的OpenGL核心版本根本不支持這些功能。

+0

謝謝。你知道現在的openGL比http://www.glprogramming.com更好的資源嗎,如果lwjgl 2.9.3支持更多的最新功能? – AaronF

+0

對於現代GL,[open.gl](http://open.gl)和[學習現代3D圖形編程](http://alfonse.bitbucket.org/oldtut/)相當不錯。 lwjgl應該支持現代GL,但我不熟悉它。 – derhass

相關問題