1.软件安装与配置
1.1基础配置
Vs2010 +GLFW(创建窗体)+GLAD(显卡opengl函数地址访问)
glfw+glad是目前OpenGl项目开发的一种常用组合方式,glfw 官网 example也是这种组合方式。
其中,GLFW用来创建窗体; GLAD用来获得显卡opengl函数地址。
这是因为:
1).OpenGL是渲染2D、3D矢量图形硬件的一种软件接口,但OpenGL只提供了绘图功能,创建窗口是需要自己完成的。这就需要学习相应操作系统的创建窗口方法,比较复杂,并且每个操作系统都不同。为简化创建窗口的过程,可以使用专门的窗口库,例如GLUT、GLFW等。由于GLUT已经是90年代的东西了(不过后来还有freeglut),而GLFW是新的,因此建议使用GLFW。
2). 因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。取得地址的方法因平台而异,以Windows为例,非常复杂,而且很繁琐,我们需要对每个可能使用的函数都要重复这个过程。幸运的是,有些库能简化此过程,其中GLAD是目前最新,也是最流行的库。
参考网址
各类之间的关系简介
OpenGL之gult/freeglut/glew/glfw/glad的联系与区别_无名小卒000001的博客-CSDN博客_freeglut glfw
OpenGL入门教程
https://blog.csdn.net/xiangzhihong8/article/details/84776943?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165061786516782184628461%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165061786516782184628461&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-84776943.142^v9^pc_search_result_cache,157^v4^control&utm_term=OpenGL&spm=1018.2226.3001.4187
GLFW+GLAD配置
https://learnopengl-cn.github.io/01%20Getting%20started/02%20Creating%20a%20window/#glad
1.2GLFW配置
参考网址
[OpenGL]配置GLFW(超详细):
[OpenGL]配置GLFW(超详细) - collectionne - 博客园
GLFW+GLAD配置:
https://learnopengl-cn.github.io/01%20Getting%20started/02%20Creating%20a%20window/#glad
-
使用步骤:库编译+ IDE工程配置
通过库编译,生成适用的库文件:
- 官网下载GLFW源码;
- Cmake生成VS工程文件;
- 打开Cmake生成的工程文件;
- 将任一example工程设为为启动项;
- 开始编译,编译结束后在build\src\Debug中出现glfw3.lib文件;
库生成完毕之后,我们需要让IDE知道库和头文件的位置:
- 建立一个新的目录,如C:\Program Files (x86)\OpenGl,里面包含lib和Include文件夹,用以存放OpenGL工程用到的所有第三方库和头文件;
- 将GLFW的头文件目录GLFW和deps拷贝至include文件中;将lib文件拷贝至lib文件夹中;
- 设置IDE的路径和依赖的库文件glfwlib
1.3GLAD配置
参考网址
[OpenGL]配置GLFW(超详细):
[OpenGL]配置GLFW(超详细) - collectionne - 博客园
GLFW+GLAD配置:
https://learnopengl-cn.github.io/01%20Getting%20started/02%20Creating%20a%20window/#glad
使用步骤:源文件获取+ IDE工程配置
1).打开GLAD的在线服务,将语言(Language)设置为C/C++,在API选项中,选择3.3以上的OpenGL(gl)版本(我们的教程中将使用3.3版本,但更新的版本也能用)。之后将模式(Profile)设置为Core,并且保证选中了生成加载器(Generate a loader)选项。现在可以先(暂时)忽略扩展(Extensions)中的内容。都选择完之后,点击生成(Generate)按钮来生成库文件。
2).GLAD现在应该提供给你了一个zip压缩文件,包含两个头文件目录,和一个glad.c文件。将两个头文件目录(glad和KHR)复制到你的Include文件夹中(或者增加一个额外的项目指向这些目录),并添加glad.c文件到你的工程中。
3).经过前面的这些步骤之后,你就应该可以将以下的指令加到你的文件顶部了:
#include <glad/glad.h>
点击编译按钮应该不会给你提示任何的错误。经上述配置后,就可以使用GLFW和GLAD来设置OpenGL上下文并创建一个窗口。
2.第一个窗口示例
参考网址
示例释义
/** 1.初始化GLFW**/
glfwInit();
/** 2.配置GLFW **/
/* 告知GLFW,OPENGL版本号 3.3 */
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
/* 告知GLFW,使用的是核心模式*/
//明确告诉GLFW我们需要使用核心模式意味着我们只能使用OpenGL功能的一个子集(没有我们已不再需要的向后兼容特性)
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
/** 3.创建窗口 **/
/* 函数名:长、宽、名,最后两个参数暂时忽略*/
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
/** 4.通知GLFW,将所创建的窗口的上下文设置为当前线程的主上下文了**/
glfwMakeContextCurrent(window);
/** 5.GLAD初始化 **/
/*GLAD是用来管理显卡的OpenGL函数指针的,所以在调用任何OpenGL的函数之前需要初始化GLAD*/
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
/** 6.渲染窗口的尺寸大小,即视口(Viewport))设置**/
/*这样OpenGL才知道怎样根据窗口大小显示数据和坐标*/
/*OpenGL幕后使用glViewport中定义的位置和宽高进行2D坐标的转换,将(-1,1)的NDC坐标转为屏幕像素坐标*/
/* 个人理解,其实是为光栅化提供依据*/
glViewport(0, 0, 800, 600);
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);//窗口大小改变时Viewport设置
/** 7.渲染循环 **/
/* 希望程序在我们主动关闭它之前不断绘制图像并能够接受用户输入 */
/* (1)每次循环开始前检查一次GLFW是否被要求退出 */
while(!glfwWindowShouldClose(window))
{
/* (2)检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,并调用对应的回调函数(可以通过回调方法手动设置)。*/
glfwSwapBuffers(window);
/* (3)双缓冲交换,使屏幕输出显示,类似于DirectDraw的blt*/
glfwPollEvents();
}
/** 8.渲染结束,释放资源**/
glfwTerminate();