這個系列教程 是[https://github.com/mattdesl/lwjgl-basics/wiki][1]的系列翻譯。
爲了減小一些不重要的細節 咱們這個系列教程是利用LWJGL(Lightweight Java Game Library)實現的。可是對LWJGL的瞭解不是必須的。每一個Shaders 教程咱們都有一個libgdx的實現。
這一節咱們介紹一個簡單的渲染週期,之後咱們會擴展它去學習。這是一段用來展現LWJGL生命週期的代碼,代碼很簡單,很容易看懂。你也能夠在 LWJGL wiki找到更多的例子。代碼放在文章的最後。
opengl的啓動
爲了讓opengl正常的工做,咱們須要按順序執行一坨東西。
首先咱們要讓opengGL的視區和顯示的視區一致。咱們也要在顯示的視區變化大小的時候去執行它:php
glViewport(0, 0, Display.getWidth(), Display.getHeight());
下一步 咱們要關閉掉大部分2d遊戲用不到的深度測試(depth testing 是測試位置遠近的,以達到渲染順序的正確的做用)。在2d遊戲中哪一個sprite在上邊 是有由draw的順序決定的。如今咱們先不考慮有深度測試的狀況。git
glDisable(GL_DEPTH_TEST);
下一步咱們要讓blending(混合)功能啓做用。咱們在其餘節去解釋它的細節。若是blending不生效,一些透明的sprites不能像咱們想要的那樣渲染。github
glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
在初始化中咱們要設置清除顏色 。就是每次opengl清除屏幕要用的顏色。記住RGBA 4個浮點數的範圍都是0.0f ~1.0f。這裏咱們指定爲透明黑。緩存
glClearColor(0f, 0f, 0f, 0f);
注意opengl 是一個 靜態的 基於狀態的API。簡單來講就是 咱們設置了一個狀態,若是咱們不去設置另外一個狀態,那麼這個狀態是不改變的。因此咱們沒有必要每一幀都去調用設置狀態的函數。除非一些第三方庫去自動調用。
遊戲主循環
下邊的遊戲循環是很簡單的。在這裏咱們設置了每秒60貞。
因爲 LWJGL 用了雙緩衝技術(Double Buffering)因此每次調用update的時候咱們都要清除緩存。app
glClear(GL_COLOR_BUFFER_BIT);
這樣屏幕就會變爲咱們以前設置的黑色。
好了剩下的代碼你們應該能夠本身看懂了。
所有代碼函數
package mdesl.test; import static org.lwjgl.opengl.GL11.GL_BLEND; import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_TEST; import static org.lwjgl.opengl.GL11.GL_ONE_MINUS_SRC_ALPHA; import static org.lwjgl.opengl.GL11.GL_SRC_ALPHA; import static org.lwjgl.opengl.GL11.glBlendFunc; import static org.lwjgl.opengl.GL11.glClear; import static org.lwjgl.opengl.GL11.glClearColor; import static org.lwjgl.opengl.GL11.glDisable; import static org.lwjgl.opengl.GL11.glEnable; import static org.lwjgl.opengl.GL11.glViewport; import org.lwjgl.LWJGLException; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; /** * A bare-bones implementation of a LWJGL application. * @author davedes */ public class Game { // Whether to enable VSync in hardware. public static final boolean VSYNC = true; // Width and height of our window public static final int WIDTH = 800; public static final int HEIGHT = 600; // Whether to use fullscreen mode public static final boolean FULLSCREEN = false; // Whether our game loop is running protected boolean running = false; public static void main(String[] args) throws LWJGLException { new Game().start(); } // Start our game public void start() throws LWJGLException { // Set up our display Display.setTitle("Display example"); //title of our window Display.setResizable(true); //whether our window is resizable Display.setDisplayMode(new DisplayMode(WIDTH, HEIGHT)); //resolution of our display Display.setVSyncEnabled(VSYNC); //whether hardware VSync is enabled Display.setFullscreen(FULLSCREEN); //whether fullscreen is enabled //create and show our display Display.create(); // Create our OpenGL context and initialize any resources create(); // Call this before running to set up our initial size resize(); running = true; // While we're still running and the user hasn't closed the window... while (running && !Display.isCloseRequested()) { // If the game was resized, we need to update our projection if (Display.wasResized()) resize(); // Render the game render(); // Flip the buffers and sync to 60 FPS Display.update(); Display.sync(60); } // Dispose any resources and destroy our window dispose(); Display.destroy(); } // Exit our game loop and close the window public void exit() { running = false; } // Called to setup our game and context protected void create() { // 2D games generally won't require depth testing glDisable(GL_DEPTH_TEST); // Enable blending glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Set clear to transparent black glClearColor(0f, 0f, 0f, 0f); // ... initialize resources here ... } // Called to render our game protected void render() { // Clear the screen glClear(GL_COLOR_BUFFER_BIT); // ... render our game here ... } // Called to resize our game protected void resize() { glViewport(0, 0, Display.getWidth(), Display.getHeight()); // ... update our projection matrices here ... } // Called to destroy our game upon exiting protected void dispose() { // ... dispose of any textures, etc ... }