提示:半自制方法,跟拍需谨慎
怨念:
1、网上资料非常少,而且上来就就一堆操作糊你脸上,根本不给你介绍各个库的相互关系。
2、本身OpenGL非向下兼容的设计就很反人类,这要升级库分分钟死一堆项目。(初学者perspective)
3、网上教学资料新库旧库混杂,有些教学代码用新库,有些用旧库。
博客目标:能用codeblock运行这三个tutorial程序
Hello World(glut)
#include<iostream>
#include<GL/gl.h>
#include<GL/glu.h>
#include<GL/glut.h>
using namespace std;
int main()
{
cout<<"Hello World"<<endl;
return 0;
}
Using GFLW with blank screen ouput(glew+glfw3)
#define GLEW_STATIC
#define GLEW_BUILD
#include<windows.h>
#include<GL/glew.h>
#include<GLFW/glfw3.h>
int main()
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
GLFWwindow* window = glfwCreateWindow(800,600,"OpenGL",nullptr,nullptr);
if(!window)
{
glfwTerminate();
return 0;
}
glewExperimental = GL_TRUE;glewInit();
while(!glfwWindowShouldClose(window))
{
glClearColor(0.0f,0.0f,0.0f,1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();return 0;
}
The first triangle(glut+glew)
#include<windows.h>
#include<GL/gl.h>
#include<GL/glut.h>
using namespace std;
void initGL(){
glClearColor(0.0f,0.0f,0.0f,1.0f);
}
void display(){
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glColor3f(0.0f,0.0f,1.0f);
glVertex2f(0.1f,-0.6f);
glVertex2f(0.7f,-0.6f);
glVertex2f(0.4f,-0.1f);
glEnd();
glFlush();
}
int main(int argc,char **argv)
{
glutInit(&argc,argv);
glutCreateWindow("Vertex, Primitive & Color");
glutInitWindowSize(320,320);
glutInitWindowPosition(50,50);
glutDisplayFunc(display);
initGL();
glutMainLoop();
return 0;
}
前序知识1(OpenGL头文件含义):
- <GL/gl.h>:OpenGL所使用的函数和常量声明。
- <GL/glu.h>:GLU(OpenGL实用库)所使用的函数和常量声明。GLU库属于OpenGL标准的一部分。(以下各种库则不属于)
- <GL/glaux.h>:GLAUX(OpenGL辅助库)所使用的函数和常量声明。这个库提供了创建窗口,处理键盘和鼠标事件,设置调色板等OpenGL本身不提供,但在编写OpenGL程序时又经常用到的功能。目前这个库已经过时,只有比较少的编译环境中有提供,例如VC系列。在VC系列编译器中,使用这个头文件之前必须使用#include <windows.h>或者具有类似功能的头文件。
- <GL/glut.h>:GLUT(OpenGL实用工具包)所使用的函数和常量声明。这个库的功能大致与GLAUX类似,目前许多OpenGL教程使用这个库来编写演示程序。一些编译系统可能不直接提供这个库(例如VC系列),需要单独下载安装。这个头文件自动包含了<GL/gl.h>和<GL/glu.h>,编程时不必再次包含它们。
- <GLFW/glfw3.h> 由于GLUT和freeglut的版本太旧且不稳定(bug又多),所以开发了glfw3来替代glut的功能。
- <GL/glew.h> GLEW扩展库,跨平台,整合OpenGL的函数接口,自动识别你的平台所支持的全部OpenGL高级扩展函数。只要包含一个glew.h头文件,你就能使用gl,glu,glext,wgl,glx的全部函数。
参考资料:https://www.cnblogs.com/gujianhan/p/3702050.html
前序知识2(.h .lib .dll的含义及关系)
- .h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。
- .他们的英文分别是 header, (static) library, Dynamic Link Library。
- .h 声明函数接口,.lib告诉链接器调用的函数在哪个dll中,.dll是函数可执行代码
开始搭建
1. 下载OpenGL全家桶
https://xmueducn-my.sharepoint.com/:u:/g/personal/dmt1709533_xmu_edu_my/EcqOqTidIm9KkTm9DZ4xVrsBVFzpO9ajiGc6Kipvy7Crrw?e=5ysFNn
- Onedrive网盘,左上角下载,按不动多按几次。
- 各版本号如上图所示,64位亲测不行。
- 原则上我们只需要glew和glut
2. 搭建glut+glew编译器环境
2.1 GLUT
※找到你的codeblock目录,如果你的codeblock不是安装在默认位置,请自行寻找根目录及所对应的文件夹
- 把 GLUT 包中的 glut.dll、glut32.dll 复制到 C:\Windows\SysWOW64 目录;
- 把 glut.h 复制到 C:\Program Files (x86)\CodeBlocks\MinGW\include\GL;
- 把glut.lib、glut32.lib 复制到 C:\Program Files (x86)\CodeBlocks\MinGW\lib;
2.2 GLEW
- 把GLEW包中的glew32.dll 复制到C:\Windows\SysWOW64 目录;
- 把glew.h复制到 C:\Program Files (x86)\CodeBlocks\MinGW\include\GL;
- 把 glew32.lib、glew32s.lib 复制到 C:\Program Files (x86)\CodeBlocks\MinGW\lib。
复制好后各大文件夹应该如图所示
2.3 创建并运行project
2.3.1 选择project
2.3.2 创建GLUT
2.3.3 选择目录并一路next
2.3.4 选择你codeblock所在的根目录里的MinGW文件夹
- 如果这一步出错请仔细检查前面是否有疏漏
2.3.5一路next创建完成,画面中出现如下代码,在首段插入#include<windows.h>后点击运行
2.3.6 GLEW+GLUT环境就搭建完成了
目前为止:
- 我们可以引入gl.h,glew.h,glut.h了
- ※但是注意,他们都是在GL文件夹下面,所以我们引入的时候,一定是写成**#include<GL/xxx.h>**
- 我们现在可以愉快地自己敲敲上面的HelloWorld和The first triangle了,但是第二个程序的环境仍然没有搭建好。
补2.3.7:搭建了一个环境,事实上我们是需要声明一个编译器和其他编译器区别开来的。
所以可以按照下面的步骤,进行编译器选项的添加
自己重命名,一个新的编译器就生成了,以后要创建GLEW+GLUT文件,创建项目的时候,就使用这个编译器。
参考文献:CodeBlocks + OpenGL + GLUT +Freeglut + GLEW 开发环境搭建
作者:Lyman Yuan
3. GLEW+GLFW3环境搭建
这个一个环境搭建才是真正的复杂,我已经是简化了很多步骤,但是仍然比较麻烦,小伙伴们坐好扶稳了。
头铁的朋友们可以参考这两篇贴吧,从源文件编译开始搭建:
https://tieba.baidu.com/p/4493663232?red_tag=1779863617
https://tieba.baidu.com/p/4496683425?red_tag=1770827451
3.1 下载MinGW库和“引用”文件库
MinGW:https://sourceforge.net/projects/mingw-w64/
引用: https://xmueducn-my.sharepoint.com/:f:/g/personal/dmt1709533_xmu_edu_my/EsTde9AZWmJKtT-w8dq_0VUBEQGynBXXal2dTeNrkwErwg?e=cmWjc7
3.2 装MinGW
3.2.1 选择如图所示的架构
3.2.1 选择合适的位置(不能带有空格和中文字符)
3.2.3 安装完成
3.2.4 配置环境变量 “开始-环境变量-环境变量-path”,注意添加分号(可选)
上面下载的“引用”则解压到你打算存放OpenGL项目的文件夹
3.3 新建一个普通的控制台项目,再次进入compiler界面,进入search directories,按照如下添加
- 注意,不是新建GLFW的项目,而是一个普通的console application。
3.4 进入linker setting 按照如下添加.a文件,顺序需和我保持一致
3.5 进入Toolchain executable,按照根据自己的根目录,按照下表添加
3.6 然后按copy,选择“是”后重命名一下,生成新我们的编译器,然后OK退出
3.7 重启codeblock,创建一个控制台项目,并选择GLEW GLFW编译器(以后每次创建项目都要选择合适的编译器)
3.8 创建结束后到项目文件根目录,把“引用”的glew32dll.dll和glfw3.dll复制到文件根目录
3.9 打上代码 编译运行 大功告成
可能需要的步骤
1 如果出现类似字符问题,可以尝试把编码改换成UTF-8编码。settings->editor
4. 总结
- 搭建环境需要了解对应项目的一些版本知识。
- 清楚这些链路库的关系对于搭建环境帮助很大。
- 以后启动项目需要记得上面的某些操作。