【LWJGL官方教程】Introduction 入门
2015-10-27 19:11
393 查看
原文:https://github.com/SilverTiger/lwjgl3-tutorial/wiki/Introduction
译注:并没有逐字逐句翻译一切,只翻译了自己觉得有用的部分。另外此翻译仅供参考,请一切以原文为准。代码例子文件链接什么的都请去原链接查找。
你需要对LWJGL里任何一个callback都有强引用,由于垃圾回收机制,如果你没有强引用,VM可能会将它回收掉,导致一个ClosureError。所以保证对应每个callback都有一个类变量。
回头继续说error callback,用LWJGL提供的Callbacks类里的errorCallbackPrint方法创建一个GLFWErrorCallback。
另一种方法是new出来一个GLFWErrorCallback,然后覆盖它的调用函数。
简单起见,我们就创建一个error callback然后打印System.err.
之后设置callback。
下一步初始化GLFW,用glfwInit()。
在GLFW里,调用glfwCreateWindow(width, height, title, monitor, share)来创建窗口。在此教程中,我们暂时无视monitor和share。
你也可以设置窗口的hint,比如GLFW_RESIZABLE或GLFW_VISIBLE,但是这里我们先默认就好。
如果创建失败,方法会返回NULL,在LWJGL里其实就是0,但是最好还是用MemoryUtil里的这个静态常量NULL,这样万一以后版本升级之类的你这也不会崩。但是一般来讲,这方法不会失败,会返回一个窗口的句柄。
窗口建好,我们再设置些其他的callback,比如key callback。
别忘了要用强引用。创建这个需要覆盖GLFWKeyCallback的调用函数。
以下就是key callback的一个例子,它会检查ESC键是否被按下,按下时它将告诉窗口去关闭自己。
创建key callback后,把它注册在你的窗口上。
窗口创建完后,也可以再创建一个OpenGL context,这是渲染用的。
调用glfwMakeContextCurrent(window)来创建。在LWJGL里,你还必须调用
现在你有OpenGL context了,可以开始渲染了。
GL_TRUE来自GL11类,其实值是1,但是最好用静态常量。
在循环中,你可以任意调用OpenGL来渲染程序,在这个范例里,是一个旋转的三角形。
为了转得正确,我们需要拿到时间。幸运的是GLFW3自带高精度计时器,只需调用glfwGetTime()。它会提供自从glfwInit()调用以来经过的秒数,是double类型的。
另一件事是处理执行事件,比如键盘事件,用glfwPollEvents()来做。你也可以用glfwWaitEvents(),如果你的程序在你收到新的输入指令之前只做更新的话。
首先要销毁窗口,然后释放注册到窗口上的事件callback们,比如键盘事件。
销毁窗口并释放callback之类,要中止GLFW,释放error callback。
以上完毕,下一篇学
游戏循环。
译注:并没有逐字逐句翻译一切,只翻译了自己觉得有用的部分。另外此翻译仅供参考,请一切以原文为准。代码例子文件链接什么的都请去原链接查找。
Initializing the OpenGL context 初始化Opengl context
首先加入error callback,这样你可以看到当GLFW初始化时是否有错。你需要对LWJGL里任何一个callback都有强引用,由于垃圾回收机制,如果你没有强引用,VM可能会将它回收掉,导致一个ClosureError。所以保证对应每个callback都有一个类变量。
回头继续说error callback,用LWJGL提供的Callbacks类里的errorCallbackPrint方法创建一个GLFWErrorCallback。
另一种方法是new出来一个GLFWErrorCallback,然后覆盖它的调用函数。
简单起见,我们就创建一个error callback然后打印System.err.
private GLFWErrorCallback errorCallback = Callbacks.errorCallbackPrint(System.err);
之后设置callback。
glfwSetErrorCallback(errorCallback);
下一步初始化GLFW,用glfwInit()。
if (glfwInit() != GL_TRUE) { throw new IllegalStateException("Unable to initialize GLFW"); }现在GLFW初始化完毕,我们开始创建窗口。
在GLFW里,调用glfwCreateWindow(width, height, title, monitor, share)来创建窗口。在此教程中,我们暂时无视monitor和share。
你也可以设置窗口的hint,比如GLFW_RESIZABLE或GLFW_VISIBLE,但是这里我们先默认就好。
如果创建失败,方法会返回NULL,在LWJGL里其实就是0,但是最好还是用MemoryUtil里的这个静态常量NULL,这样万一以后版本升级之类的你这也不会崩。但是一般来讲,这方法不会失败,会返回一个窗口的句柄。
long window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL); if (window == NULL) { glfwTerminate(); throw new RuntimeException("Failed to create the GLFW window"); }
窗口建好,我们再设置些其他的callback,比如key callback。
别忘了要用强引用。创建这个需要覆盖GLFWKeyCallback的调用函数。
以下就是key callback的一个例子,它会检查ESC键是否被按下,按下时它将告诉窗口去关闭自己。
private GLFWKeyCallback keyCallback = new GLFWKeyCallback() { @Overridepublic void invoke(long window, int key, int scancode, int action, int mods) { if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) { glfwSetWindowShouldClose(window, GL_TRUE); } } };
创建key callback后,把它注册在你的窗口上。
glfwSetKeyCallback(window, keyCallback);
窗口创建完后,也可以再创建一个OpenGL context,这是渲染用的。
调用glfwMakeContextCurrent(window)来创建。在LWJGL里,你还必须调用
GLContext类的createFromCurrent(),这样库才会发现context,使OpenGL绑定成功可用。
glfwMakeContextCurrent(window); GLContext.createFromCurrent();
现在你有OpenGL context了,可以开始渲染了。
Update and Rendering loop 更新和渲染的循环
我们得使我们的程序一直在运行,直到窗口关闭。所以,写一个简单的while循环。while (glfwWindowShouldClose(window) != GL_TRUE) { /* Do something */ }
GL_TRUE来自GL11类,其实值是1,但是最好用静态常量。
在循环中,你可以任意调用OpenGL来渲染程序,在这个范例里,是一个旋转的三角形。
为了转得正确,我们需要拿到时间。幸运的是GLFW3自带高精度计时器,只需调用glfwGetTime()。它会提供自从glfwInit()调用以来经过的秒数,是double类型的。
double time = glfwGetTime();Opengl调用完,需要交换颜色缓冲区,因为GLFW使用的是双缓冲机制。调用glfwSwapBuffers(window)做这件事。
另一件事是处理执行事件,比如键盘事件,用glfwPollEvents()来做。你也可以用glfwWaitEvents(),如果你的程序在你收到新的输入指令之前只做更新的话。
glfwSwapBuffers(window); glfwPollEvents();具体内容请参照Introduction.java文件。
Ending the Application 结束程序
当结束程序时,需要释放callback们,销毁窗口,并且中止GLFW,这样所有分配的资源才能释放掉。首先要销毁窗口,然后释放注册到窗口上的事件callback们,比如键盘事件。
glfwDestroyWindow(window); keyCallback.release();
销毁窗口并释放callback之类,要中止GLFW,释放error callback。
glfwTerminate(); errorCallback.release();
以上完毕,下一篇学
游戏循环。
相关文章推荐
- php使用百度翻译api示例分享
- asp.net利用google的api做翻译
- 使用Django的模版来配合字符串翻译工作
- python实现带声音的摩斯码翻译实现方法
- 使用谷歌翻译让你的网站也实现多国语言版
- ThinkPHP调用百度翻译类实现在线翻译
- [网络开发]RakNet文档翻译(3)——Creating Packets
- 创业结束后三年 我当员工的心得(翻译版本)
- 关键帧动画
- iOS_5_Programming_Cookbook翻译各章节汇总
- NAT 精辟
- 【翻译】在backtrack5上用Evilgrade工具15步**windows
- grub2 翻译
- 使用fengoffice中文语言出现missing lang.js 的解决方法(转)
- 少儿图书出版翻译进入繁荣期
- 翻译出版业:浮华背后的下降
- 考研英语(21-30)转自何凯文老师
- webdriver常用的API翻译与解析
- tomcat安装成功页面翻译
- 本科毕业设计时翻译的一篇文章