这个系列教程 是[https://github.com/mattdesl/lwjgl-basics/wiki][1]的系列翻译。
为了减少一些不重要的细节 我们这个系列教程是利用LWJGL(Lightweight Java Game Library)实现的。但是对LWJGL的了解不是必须的。每个Shaders 教程我们都有一个libgdx的实现。
这一节我们介绍一个简单的渲染周期,以后我们会扩展它去学习。这是一段用来展示LWJGL生命周期的代码,代码很简单,很容易看懂。你也可以在 LWJGL wiki找到更多的例子。代码放在文章的最后。
opengl的启动
为了让opengl正常的工作,我们需要按顺序执行一坨东西。
首先我们要让opengGL的视区和显示的视区一致。我们也要在显示的视区变化大小的时候去执行它:
glViewport(0, 0, Display.getWidth(), Display.getHeight());
下一步 我们要关闭掉大部分2d游戏用不到的深度测试(depth testing 是测试位置远近的,以达到渲染顺序的正确的作用)。在2d游戏中哪个sprite在上边 是有由draw的顺序决定的。现在我们先不考虑有深度测试的情况。
glDisable(GL_DEPTH_TEST);
下一步我们要让blending(混合)功能启作用。我们在其他节去解释它的细节。如果blending不生效,一些透明的sprites不能像我们想要的那样渲染。
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的时候我们都要清除缓存。
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 ...
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。