有一段时间了,我一直想着进入某些视频游戏开发领域. 对于OpenGL我也很感兴趣,并且因此我也想到了为什么不深入去研究研究OpenGL,再去做一款视频游戏呢?我已经有了许多我想要去探索的游戏的点子,但第一都是得要婴儿学步的不是吗?
我的原始计划是要去构建: 一个类似AI的 Pong 游戏克隆 一个 几何战争 游戏的克隆 开始着手实现属于我自己的疯狂想法
然而,我最近在浏览HackerNew时偶然发现了 (游戏机制探索器)Game Mechanic Explorer. 它是一个有John Watson 创建的真正很酷的站点,那里面他使用 Phaser 游戏框架创建了一大堆不同的游戏机制. 他给它们中的每一个都分配了一个单独的页面,带上了可以试玩的示例,还有代码和介绍. 这是一个令人着迷的网站,我强烈呼吁大家花几分钟时间来看看它.
看到该网站后,我决定更换我的原来的计划#1但是使用OpelGL重新创建我的作品.我认为这比创造Pong clone更有雄心,但是我仍能实现. 我已经发现一些资源来帮助我开始OpenGL的开发.我将在这里一一列举以供参考,但是详细解说不在此文章的范围之内.
然而.关于The OpenGL SuperBible我要说一件事(我买的是这本书)和我同一个书圈的人都有相同的.抱怨.本书中作者抽象了太多代码称为书中的库.这对于新手来说理解和追查OpenGL有些困难.如果你跟着书中的代码,将会容易理解.如果你不理解库在做什么,你将会迷失在库中和书中.
在文章的其余部分,我将探讨如何才能设置 Mac OS X开始使用OpenGL进行开发 ,同时展示一个简单的三角形.
在开始之前,你能在gist发现这篇博客的全部代码.如果你想看到我们目前的整个项目,你可以在Github上找到它.
所以在开始在OS X使用OpenGL开发,如果你还没有,我建议去获得Homebrew.我们需要做的第一件事就是获得两个个libraries.这都不是必须的,有一些是可以替代的,当然我们必须有其中的一种.
现在让我们一起熟悉我们将使用的Makefile:
如果你熟悉Makefiles.这应该是非常标准的.有一点需要注意的是第19行:the linker flags.OS X 自带的 OpenGL.所以我们应该特别的去指定它.当然我们也应该链接上刚刚安装的两个libraries.当我们添加更多的文件时,我们应该加到OBJS列表中.
让我们做一个简单的程序在屏幕上显示一个三角形:

我会分别说明这些代码的用途,全部的源代码在here.
在 GLFW中有许多的回调.我们只需要两个用于这项工作.第一个是打印输出任何错误信息,二是声明当按下ESC键时,项目停止.以下函数定义了怎么做,当我们准备我们的项目时,我们注册它.
02 | void error_callback( int error, const char * description) { |
03 | fputs (description, stderr); |
07 | void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) { |
08 | if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) |
10 | glfwSetWindowShouldClose(window, GL_TRUE); |
为了建立一个OpenGL程序渲染,有许多事情需要做。下面的代码添加了注释,对主要的部分进行了解释。 03 | fprintf (stderr, "Failed initialize GLFW." ); |
08 | glfwSetErrorCallback(error_callback); |
12 | glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); |
13 | glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); |
15 | glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); |
17 | glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); |
19 | glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); |
22 | GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL" , NULL, NULL); |
26 | fprintf (stderr, "Failed to create GLFW window." ); |
32 | glfwMakeContextCurrent(window); |
35 | glfwSetKeyCallback(window, key_callback); |
37 | printf ( "OpenGL version supported by this platform (%s): \n" , glGetString(GL_VERSION)); |
40 | glewExperimental = GL_TRUE; |
|