游戏引擎养成《四》 添加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 Xblog.hwrd.me图标

编辑于 2019-03-03

文章被以下专栏收录