资源文件包括glut、freeglut、glew、GLTools,这些文件可以去官网下载最新版本,也可以从下面的链接中得到。
下载地址(未编译的文件):https://pan.baidu.com/s/1wnV5tmInJnBVlxWvhMIZHQ 密码:08zm
下载地址(VS2019编译过的文件):https://pan.baidu.com/s/1ybwvFLLN-8oV0sOwwwmfww 密码:ocm2
为什么要编译文件,如果下载他人编译过的文件直接使用,由于编译的平台不一样,程序运行时会出现版本不兼容的问题。所以为了更好地使下载的库文件与自己的VS版本兼容,需要我们对源码进行重新编译。
1.若下载VS2019编译后的文件可以直接跳到环境配置
2.未编译资源文件中需要自己编译的有freeglut、与GLTools。
需要用到的软件cmake:https://github.com/Kitware/CMake/releases/download/v3.16.0-rc3/cmake-3.16.0-rc3-win32-x86.zip
解压Cmake压缩包,打开bin目录下的cmake-gui运行软件。然后在freeglut文件夹中新建一个build文件夹(用来存放编译结果)
在Cmake中分别选择freeglut文件夹以及build文件夹,然后点击configure
然后分别选择VS2019(编译平台,根据自己需要选择)和WIN32(我选择了32位,下面的也是),并点击finish
点击Generate
最后点击Open Project,打开VS进行编译
若无法自动打开VS可在build文件夹中点击freeglut.sln打开VS
然后选择Debug以及WIN32,并在生成中点击生成解决方案,等待Debug编译完成。
同样的选择Release、Win32,并在生成中点击生成解决方案,等待Release编译完成。
此时我们已经完成了freeglut的编译工作,接下来需要把**.h文件以及.lib文件找出来,首先新建一个文件夹gltools**(最后的环境配置需要用到),并在gltools文件夹中新建include文件夹、lib文件夹以及dll三个文件夹,最后还需要在include文件夹中新建一个GL文件夹。
在下载的文件夹中,将freeglut-3.0.0 -> include -> GL中的5个头文件(.h)复制到gltools-> include -> GL
打开编译完成的文件夹build,然后进行以下操作:
build-> lib->Debug中的 freeglut_staticd.lib、freeglutd.lib 复制到 gltools-> lib build-> lib-> Release
freeglut_static.lib、freeglut.lib复制到gltools-> lib
build->bin->Debug中的freeglutd.dll复制到gltools->dll
build->bin->Release中的freeglut.dll复制到gltools->dll
这个两个库文件并不要我们单独编译,直接用就可以了。同样的,需要把用到的文件复制出来,具体如下:
glew
将glew-2.1.0 -> include -> GL中的四个头文件复制到gltools-> include -> GL
glew-2.1.0 ->lib -> Release -> Win32 中的两个lib文件复制到gltools-> lib
glew-2.1.0 -> bin -> Release -> Win32中的glew32.dll复制到gltools-> dll
打开glut文件夹,进行如如下操作:Glut.lib、glut32.lib复制到gltools-> lib
Glut.dll、glut32.dll复制到gltools-> dll
编译gltools需要前面的准备工作都已完成。首先将下载的GLTools -> include 中的11个头文件全部复制到gltools -> include (不是GL文件夹)
打开VS创建新项目-> windows 桌面向导,设置项目名字为gltools(不要随意起名字,后面需要生成一个gtloos.lib文件),位置可以随便找一个,尽量放在下载的资源包GLtools->build文件夹中,方便后续查找。
应用类型选择静态库,其他选项选为空项目,如下图:
然后添加头文件以及源文件(头文件 -> 添加 -> 现有项)
头文件:(注意路径!!!)
同样的方法添加源文件:(源文件 -> 添加 -> 现有项)
最后工程的添加结果如下:
选中gltools,右键-> 属性 进行如下设置:(注意这次的include,是前面新建的文件夹),然后点击应用、确认。
最后,选中gltools, 右键 -> 生成(或者点击窗口上面的生成->生成解决方案)
根据生成的路径找到gltools.lib,并将其复制到gltools ->lib(新建的文件夹),到了这一步就完成了gltools的编译。
首先,新建一个工程文件夹用来存放之后的代码(位置自己随便定义)。然后,打开VS新建一个控制台应用(创建新项目-> windows 桌面向导 ->应用类型选择控制台应用,其他默认就可以)。
选中项目名字,右键-> 属性 进入配置界面进行如下设置,将自己之前新建文件夹的include文件夹(头文件)以及lib文件夹(链接库)分别添加进去。
链接器-> 输入 ->附加依赖项 将opengl32.lib、gltools.lib、glew32s.lib添加进去,如下图:
将之前新建文件夹gltools-> dll中的5个文件,粘贴到C:\Windows\System32和C:\Windows\SysWOW64,至此,完成所有环境配置。
将以下代码复制到工程中cpp文件中。
// Triangle.cpp
// Our first OpenGL program that will just draw a triangle on the screen.
#include // OpenGL toolkit
#include // Shader Manager Class
#ifdef __APPLE__
#include // OS X version of GLUT
#else
#define FREEGLUT_STATIC
#include // Windows FreeGlut equivalent
#endif
GLBatch triangleBatch;
GLShaderManager shaderManager;
// Window has changed size, or has just been created. In either case, we need
// to use the window dimensions to set the viewport and the projection matrix.
void ChangeSize(int w, int h)
{
glViewport(0, 0, w, h);
}
// This function does any needed initialization on the rendering context.
// This is the first opportunity to do any OpenGL related tasks.
void SetupRC()
{
// Blue background
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
shaderManager.InitializeStockShaders();
// Load up a triangle
GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f,
0.5f, 0.0f, 0.0f,
0.0f, 0.5f, 0.0f };
triangleBatch.Begin(GL_TRIANGLES, 3);
triangleBatch.CopyVertexData3f(vVerts);
triangleBatch.End();
}
// Called to draw scene
void RenderScene(void)
{
// Clear the window with current clearing color
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f };
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
triangleBatch.Draw();
// Perform the buffer swap to display back buffer
glutSwapBuffers();
}
// Main entry point for GLUT based programs
int main(int argc, char* argv[])
{
gltSetWorkingDirectory(argv[0]);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
glutInitWindowSize(800, 600);
glutCreateWindow("Triangle");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
GLenum err = glewInit();
if (GLEW_OK != err) {
fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
return 1;
}
SetupRC();
glutMainLoop();
return 0;
}
运行结果如下:
成功运行!!!!