opengl游戏引擎源码_游戏引擎养成《四》 添加GLEW

# 继续搭建渲染框架

我们继续完善渲染框架,今天要引入的是glew。对于glew和glfw,下文是我认为讲的比较清晰的一份表述。

## 什么是GLEW

the OpenGL Extension Wrangler Library
The OpenGL Extension Wrangler (GLEW) is used to access the modern OpenGL API functions(version 3.2 up to latest version).If we use an ancient version of OpenGL then we can access the OpenGL functions simply including as #include <GL/gl.h>. But in modern OpenGL, the API functions are determined at run time, not compile time.
GLEW is a cross-platform open-source C/C++ extension loading library. GLEW provides efficient run-time mechanisms for determining which OpenGL extensions are supported on the target platform. GLEW will handle the run time loading of the OpenGL API.
GLFW or freeglut will allow us to create a window, and receive mouse and keyboard input in a cross-platform way. OpenGL does not handle window creation or input, so we have to use these library for handling window, keyboard, mouse, joysticks, input and other purpose.
GLFW and freeglut are alternative for us according to our need we can choose any one but GLEW is different from them which is used for run time loading of the OpenGL API.

GLEW 是Opengl扩展库,使用它可以很方便的调用OpenGL较新的特性。GLEW能自动识别你的平台所支持的全部OpenGL高级扩展涵数,也就是说,只要包含一个glew.h头文件,你就能使用gl, glu, glext, wgl, glx的全部函数。 值得拥有

# 集成

## 下载与编译 GLEW

### Window 下 The OpenGL Extension Wrangler Library

直接下载binaries

CMakeLists.txt修改两处,引入GLEW,并重新cmake 运行即可。

if(WINDOWS)
    link_directories("${PROJECT_SOURCE_DIR}/Dependencies/GLFW/lib-vc2015"
    				"${PROJECT_SOURCE_DIR}/Dependencies/GLEW/lib/Release/Win32")
#   
if(WINDOWS)
	# copy dll
    add_custom_command(TARGET sample 
    POST_BUILD COMMAND 
    ${CMAKE_COMMAND} -E copy_directory "${PROJECT_SOURCE_DIR}/Dependencies/GLEW/bin/Release/Win32" "$<TARGET_FILE_DIR:sample>")

	target_link_libraries(  sample 
				PhantomCore 
				opengl32.lib 
				glew32.lib
				glfw3.lib)
我们使用动态链接库,加个command在编译时自动拷贝dll文件夹到目标目录, 这里注意2个地方
* add_custom_command 添加自定义命令,可以多个依次输入
* $<TARGET_FILE_DIR:sample> 注意这里是尖括号 ,与平常的{}不同。

还要强调一点,glew使用动态链接库dll还是静态链接库libglew32s.lib受它的宏定义影响 ,截取自glew.h的代码如下,所以如果发现有链接库报错,不妨查下这方面原因:

/*
 * GLEW_STATIC is defined for static library.
 * GLEW_BUILD  is defined for building the DLL library.
 */

#ifdef GLEW_STATIC
#  define GLEWAPI extern
#else
#  ifdef GLEW_BUILD
#    define GLEWAPI extern __declspec(dllexport)
#  else
#    define GLEWAPI extern __declspec(dllimport)
#  endif
#endif

### Mac

mac 上添加两行即可编译

link_directories("${PROJECT_SOURCE_DIR}/Dependencies/GLEW/lib/Release/mac")


    target_link_libraries(sample  
    	PhantomCore 
    	${OPENGL_LIBRARIES} 
        libGLEW.a
    	${EXTRA_LIBS}
    	libglfw3.a
    )
但是噩耗随后传来,运行会报错,原因特尴尬 glGenVertexArrays 这个api 我的MAC OSX版本 不支持,我获取了OpenGL Version < glGetString(GL_VERSION)> == 2.1 。 好吧我们暂时注释掉这个api继续数学库的编写好了,到后面再解决这个问题。

# 继续

现在我们可以#include <GL/glew.h>使用opengl api了。

注意 对glew.h的引用要在所有opengl 头文件引用之前。

总结下:

  • 我们使用cmake+clang 创建目录,这样使得我们可以跨平台编译
  • 通过windows+ mac 平台测试,成功搞定双平台开发环境
  • 添加了glfw ,glew 方面我们使用opengl开发
  • 创建了window类,启动了一个基础窗口,并测试了opengl基础命令。

# 万事俱备,整装出发!

可以参考 GLFW 官方入门文档写一个简单的小程序,我们在这里就不展开了。。。

在这节后开发、渲染环境搭建好了,我们会在接下来写两节数学库,为后续渲染部分做准备。事先声明,可以直接拿现有的库即可,重复写这几个库也只是巩固下基础知识,意义不大。

所以想快速看到效果的同学可以直接跳到第七节。

游戏引擎养成《五》 数学库-向量

游戏引擎养成《七》 Shader Part 1!

refs:

Beginning OpenGL Development on OS X​blog.hwrd.me
b1f7ca367287bfc17db8642785dbaea9.png
作者对游戏的说明: 首先,您应当以一种批判的眼光来看待本程序。这个游戏是我制作 的第一部RPG游戏,无任何经验可谈,完全按照自己对游戏的理解进 行设计的。当我参照了《圣剑英雄2》的源码之后,才体会到专业游 戏引擎的博大精深。 该程序的内核大约有2000余行,能够处理人物的行走、对话、战斗, 等等。由于该程序的结构并不适于这种规模的程序,故不推荐您详 细研究该程序。所附地图编辑器的源程序我已经添加了详细的注释, 其程序结构也比较合理,可以作为初学VC的例子。 该程序在VC的程序向导所生成的SDI框架的基础上修改而成。它没有 使用任何关于VC底层的东西。程序的绝大部分都是在CgameView类中 制作的,只有修改窗口特征的一段代码在CMainFrm类中。其他的类 统统没有用到。另外添加的一个类是CEnemy类。 整个游戏的故事情节分成8段,分别由Para1.h ~ Para8.h八个文件 实现。由于程序仅仅能够被动的处理各种各样的消息,所以情节的 实现也只能根据系统的一些参数来判断当前应当做什么。在程序中 使用了冗长的if……else if……结构来实现这种判断。 当然,在我的记录本上,详细的记录了每个事件的判断条件。这种 笨拙的设计当然是不可取的。成都金点所作《圣剑英雄II》采用了 剧本解读的方式,这才是正统的做法。但这也需要更多的编程经验 和熟练的code功夫。 下面列举的是程序编制过程中总结出来的经验和教训。 第一,对话方式应该采用《圣剑英雄II》的剧本方式。 现在的方式把一个段落中所有的对话都混在一个文件中,然后给每 句话一个号码相对应。这样做虽然降低了引擎的难度,却导致剧情的 编写极其繁琐。 第二,运动和显示应当完全分开。 现在的程序中,运动和显示是完全同步的。即:在定时器中调用所有 敌人的运动函数,然后将主角的动画向前推一帧,接着绘制地图,调 用所有敌人的显示函数、重绘主角。这样的好处是不会掉帧,但带来 的问题是,如果要提高敌人的运动速度,那么帧数也跟着上去了。所 以当DEMO版反馈说速度太慢的时候,我修改起来非常困难。而这个问 题到最后也仅仅是将4步一格该成了2步一格。 第三,VC中数组存在上限。如果用“int aaa[1000000000]”定义一个 数组,编译器肯定不会给分配那么大的内存空间。而在这个程序中, 地图矩阵、NPC矩阵都超过了VC中数组的上限。但这一点知道的太晚了。 在1.0版本中已经发现地图最右端缺少了几行,但不知道是什么原因 造成的。(地图编辑器中未出现此问题,因为地图编辑器是用“序列 化”的方式存盘读盘的。)解决这个问题的方法是用“new”来分配 内存空间。 第,由于不知道应该如何使用“new”和“delete”,几乎所有的DC 都使用了全局变量。这是完全没有必要的。程序运行期大约会耗用20 多M的内存空间,相当于一个大型游戏所使用的内存空间了。 另外,在游戏的剧情、美工方面也有许多问题,总之一个词“业余”。 我就不总结了。下一部作品,我将争取在程序上有一个质的飞跃。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值