【LWJGL官方教程】渲染

原文:https://github.com/SilverTiger/lwjgl3-tutorial/wiki/Rendering
译注:并没有逐字逐句翻译一切,只翻译了自己觉得有用的部分。另外此翻译仅供参考,请一切以原文为准。代码例子文件链接什么的都请去原链接查找。括号里的内容一般也是译注,供理解参考用。总目录传送门:http://blog.csdn.net/zoharwolf/article/details/49472857

这次教程终于要用OpenGL 3.2核心profile来做渲染了。
注意源代码也提供了OpenGL 2.1的一个版本。

Creating the context 创建上下文

在我们开始之前,先要告诉GLFW要用的是OpenGL 3.2核心profile的上下文,用以下代码就可以:

glfwDefaultWindowHints();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
long window = glfwCreateWindow(width, height, title, NULL, NULL);

我们先设置窗口的hint一律为默认,用glfwDefaultWindowHints()即可。这样做,防止之前已经用其他hint创建过其他窗口影响到我们这次的创建。
GLFW_CONTEXT_VERSION_MAJOR和GLFW_CONTEXT_VERSION_MINOR顾名思义,就是要告诉GLFW创建的是3.2版本的上下文。
在GLFW_OPENGL_PROFILE,我们指定要使用核心功能。如果你想用低于3.2版本的OpenGL,你需要指定的是GLFW_OPENGL_ANY_PROFILE,默认其实就是这个值。
GLFW_OPENGL_FORWARD_COMPAT这个hint指定OpenGL的上下文是否应该向前兼容,如果设定成TRUE,它会停用所有的废弃功能。如果是用OpenGL3.0版本以下,请无视这个hint。

如果你的图形卡不支持 OpenGL 3.2版本,创建的窗口会是NULL,如果那样的话,试着用以下代码创建一个传统的OpenGL 2.1上下文。

glfwDefaultWindowHints();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
long window = glfwCreateWindow(width, height, title, NULL, NULL);

Vertex Array Objects 顶点数组对象

现在,我们有了窗口,窗口里也有我们要的上下文了,可以开始初始化渲染。
首先应该创建一个顶点数组对象,简称VAO(Vertex Array Object),它用来储存所有的链接,这些链接用来连结你的顶点缓冲对象和属性们。所以,记得要最先创建VAO然后绑定它。

int vao = glGenVertexArrays();
glBindVertexArray(vao);

你能在LWJGL3的GL30类里找到这两个方法。因为版本是3,所以如果你用的是OpenGL2.1上下文,就别用它们了。

Vertex Buffer Objects 顶点缓冲对象

在老式的固定功能管线里,你只能在每次glBegin(target)和glEnd()间的渲染调用里传递你的顶点(指老版本的OpenGL的机理),但是现代的方法却是把它们放在顶点缓冲对象VBO(Vertext Buffer Object)里。
VBO用来储存所有你GPU里的顶点数据。LWJGL里,你需要创建一个缓冲将顶点传到GPU。在我们的简单例子里,就用入门教程里的那个三角形。创建缓冲的话,就用LWJGL里的BufferUtil来创建一个合适的FloatBuffer。

注意,为了方便起见,顶点是逆时针排序的。

FloatBuffer vertices = BufferUtils.createFloatBuffer(3 * 6);
vertices.put(-0.6f).put(-0.4f).put(0f).put(1f).put(0f).put(0f);
vertices.put(0.6f).put(-0.4f).put(0f).put(0f).put(1f).put(0f);
vertices.put(0f).put(0.6f).put(0f).put(0f).put(0f).put(1f);
vertices.flip();

别忘了来一下vertices.flip()!这很重要,因为不这样的话你JVM会崩出一个EXCEPTION_ACCESS_VIOLATION。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值