前言:之前同事说OpenGL环境贼难搭建,搭建了好多次都没成功过。恰巧最近自己也在学习OpenGL超级宝典,开发环境这块必须得支持,否则往后学习就是光看不练假把式了。于是今天特意花了一上午时间上网搜索了相关资料,搭建过程也不是一帆风顺,但好在最终还是搭建完毕了,可以愉快的吃个中饭了。
Windows平台搭建篇:
**方式一:**采用vs2013+freeglut-2.8.1+glew-1.7.0+gltools进行搭建。搭建流程如下:
1.下载glew-1.7.0:根据自己电脑操作系统位数来选择下载64位还是32位版本的glew。这里还需要把glew的源码下载下来,因为后面的gltools制作静态库时需要用到该源码文件。下载如图所示:
2.安装glew-1.7.0:由于我电脑是64位操作系统,所以我下载的是glew-1.7.0-win64.zip。下载下来后解压该zip文件,并进行以下操作:
一.将位于include文件夹下的GL文件夹复制到“vs2013安装根目录\VC\include“下。如图所示:
二.将位于lib 文件夹下的 .lib 文件复制到“vs2013安装根目录\VC\lib“下。如图所示:
三.将位于bin 文件夹下的 .dll 复制到 C:\Windows\System32目录中,如果是64位系统则放在SysWOW64目录。如图所示:
3.下载freeglut2.8.1。将下载完毕的freeglut2.8.1进行解压,并将位于include文件夹下的GL文件夹复制到“vs2013安装根目录\VC\include“下。如图所示:
4.生成freeglut静态库:生成流程如下所示:
一.用vs2013打开\freeglut-2.8.1\VisualStudio\2012\freeglut.sln项目文件。如图所示:
二.将解决方案配置设置成Release_Static编译模式。如图所示 :
此时配置属性也会自动调成Release_Static编译模式。如图所示:
三.生成解决方案,此时会在freeglut-2.8.1\lib\x86生成一个freeglut_static.lib文件。最后将生成的freeglut_static.lib文件复制到“vs2013安装根目录\VC\lib“目录下。流程如图所示:
5.生成GLTools静态库:必须在glew和freeglut配置完毕后才能进行GLTools静态库的生成。生成过程如下所示:
一.下载GLTools源码工程:可以使用vpn+svn从http://oglsuperbible5.googlecode.com/svn/trunk下载。也可以在csdn上面下载OpenGL超级宝典第五版源码。里面都包含有GLTools源码工程。
二.用vs2013新建一个win32静态库工程(它在Win32项目下),工程名为 GLTools ,记得去掉预编译头这个选项。如图所示:
三.将glew-1.7.0源代码工程下的src目录中的glew.c文件以及GLTools源码工程下的src目录中的文件(除了glew.c文件)添加到当前GLTools静态库工程中。如图所示:
四.将GLTools源码工程下的include目录中头文件(除了GL目录下面的glew头文件)复制到“vs2013安装根目录\VC\include“下,否则GLTools静态库工程中的源码文件就会报找不到头文件错误。流程如图所示:
五. 在项目 -》属性 -》C/C++ -》预处理器 -》预处理器定义中添加 _CRT_SECURE_NO_WARNINGS。然后编译生成,编译成功后会在工程Debug目录下生成 GLTools.lib静态库文件。最后将该GLTools.lib复制到“vs2013安装根目录\VC\lib“下。流程如图所示:
6.运行测试工程:用vs2013创建一个Win32控制台程序。测试流程如下:
一.在项目 -> 属性 -> 链接器 -> 输入 -> 依赖项中添加gltools.lib,glew32s.lib并在忽略特定默认库中添加 LIBCMT MSVCRT。如图所示:
二.将超级宝典第五版中的示例代码src\Chapter02\Triangle\Triangle.cpp添加到工程中,直接编译运行成功后,即可得到一个三角形图案。
核心代码如下:
#include "stdafx.h"
#include <GLTools.h> // OpenGL工具箱:包含常用的加载库,如glew等。
#include <GLShaderManager.h> // GLTools管理着色器类,用来对内建着色器以及自定义着色器进行管理。
#ifdef __APPLE__
#include <glut/glut.h> // 苹果平台下包含有gui的OpenGL操作库glut
#else
#define FREEGLUT_STATIC // windows平台下包含的gui的OpenGL操作库freeglut
#include <GL/glut.h>
#endif
// 批处理对象,用来批次操作数据
GLBatch batch;
// 着色器管理器对象
GLShaderManager shaderManager;
// glut大小变化回调函数
void ChangeSize(int width, int height)
{
// 视口随着glut窗口的改变而改变
glViewport(0, 0, width, height);
}
// glut界面渲染回调函数
void RenderScene()
{
// 用指定颜色缓冲区的清除颜色来清除指定的缓冲区
// GL_COLOR_BUFFER_BIT表示颜色缓冲区
// GL_DEPTH_BUFFER_BIT表示深度缓冲区
// GL_STENCIL_BUFFER_BIT表示模板缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// 使用红色来填充内建的着色器GLT_SHADER_IDENTITY
GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f };
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
// 使用批处理对象利用内建着色器GLT_SHADER_IDENTITY一次性的渲染批处理对象中的数据
batch.Draw();
// 将离屏缓冲区中绘制的颜色交换到视图缓冲区中
glutSwapBuffers();
}
// 初始化渲染环境对象:由于已经在glut创建窗口时内部创建了一个该对象,所以此处就不在额外创建了。
void SetupRenderContext()
{
// 设置颜色缓冲区的清空颜色为蓝色
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
// 初始化内建着色器
shaderManager.InitializeStockShaders();
// 准备三角形顶点数组
GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f,
0.5f, 0.0f, 0.0f,
0.0f, 0.5f, 0.0f
};
// 初始化批处理对象:按照三角形处理并有三个顶点
batch.Begin(GL_TRIANGLES, 3);
// 填充数据到批处理对象中
batch.CopyVertexData3f(vVerts);
// 结束批处理对象设置
batch.End();
}
// 文件主入口
int main(int argc, char* argv[])
{
// 设置GLTools当前工作目录:
// windows平台默认是当前文件所在目录为工作目录。
// mac平台默认是App Bundle的Resource目录为当前工作目录。
gltSetWorkingDirectory(argv[0]);
// 初始化glut库
glutInit(&argc, argv);
// 设置glut显示模式:
// GLUT_DOUBLE表示双缓冲区(离屏缓冲区用来绘制图形,视图缓冲区用来显示图形。)
// GL_RGBA表示颜色模式
// GL_DEPTH表示深度缓冲区,用来进行深度测试
// GL_STENCIL表示模板缓冲区
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
// 设置glut窗口大小
glutInitWindowSize(800, 600);
// 创建glut窗口,此时内部自动创建一个OpenGL Render Context对象,也叫做OpenGL渲染环境对象。
glutCreateWindow("Triangle");
// 设置glut窗口大小变化回调
glutReshapeFunc(ChangeSize);
// 设置glut窗口渲染回调
glutDisplayFunc(RenderScene);
// 初始化glew加载库:glew包含有对opengl所有接口函数指针调用以及关联的枚举和变量等。
GLenum err = glewInit();
if (err != GLEW_OK)
{
// 初始化glew失败
fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
return 1;
}
// 初始化渲染对象,只有该对象才能对opengl库进行调用
SetupRenderContext();
// 阻塞模式开始glut主循环:此时就会按照上面设置好的数据和回调进行处理glut
glutMainLoop();
// 正常结束
return 0;
}
运行结果如图所示: