OpenGL_构建GLFW与第一个程序
参考教程:https://learnopengl-cn.github.io/
这个教程已经给出了很详细的资料,当然我这里是对细节的展示(在Windows上)。
首先,你需要准备
VS2017 : http://www.baidu.com [当然你也可以用别的,但我使用的是它!]
GLFW(源文件):https://www.glfw.org/download.html
CMake :https://cmake.org/download/
GLAD : 然后你还要去https://glad.dav1d.de/生成一个zip压缩文件,你将它下载下来即可。
资料:
打开GLAD的在线服务,将语言(Language)设置为C/C++,
在API选项中,选择3.3以上的OpenGL(gl)版本(我们的教程中将使用3.3版本,但更新的版本也能正常工作)。
之后将模式(Profile)设置为Core,并且保证生成加载器(Generate a loader)的选项是选中的。
现在可以先(暂时)忽略拓展(Extensions)中的内容。都选择完之后,点击生成(Generate)按钮来生成库文件。 GLAD现在应该提供给你了一个zip压缩文件,包含两个头文件目录,和一个glad.c文件。
1.构建GLFW
打开CMake,这里使用GUI的启动程序。
点击Browse Source... 选中GLFW解压出来的文件夹
点击Browse Build... 选中GLFW下的Build文件夹(没有就自己去新建一个,或者不叫这名字也没关系,这不重要)
点击 Configure 按钮,选中合适你的IDE环境,然后就按默认的选项就好,按Finish就好了。
【这里下面还有一个Optional platform for generator. | 我不知道是什么鬼,但是我选择了64| 当然你可以使用默认的32】
再点击 Generate 按钮就会生成文件了,最后输出的工程是在Build的文件夹里。
打开Build文件夹,再打开GLFW工程文件,生成编译它即可。
打开输出目录,就是箭头所指的这个东西。
接下来,我们要先新建一个C++项目,并在该项目的文件夹下新建两个文件夹,一个include,一个libs.
把GLFW和GLAD的include下的文件夹复制到我们新建的include
把我们刚才的生成的glfw3.lib搬到libs文件夹。
把GLAD的include/src下的*.c文件复制到工程文件夹,添加到工程里。
【由于某些不可抗力的因素,我的VS居然没有OpenGL32 !!!】
【所以我需要把从别人复制一份过来引用 这里用的是64位的。】 ps: 感谢冰棍分享给我OpenGL32.lib。
接下来配置两个地方。
【请注意,如果你也和我一样编译了64位的glfw,那请注意 -- 在[本地Windows 调试器]的左边有两个下拉选择,默认是x32,你要把它调整位x64,否则无法通过编译。】
打开工程,在右边(默认是这样)的解决方案资源管理器,右键工程,选择属性。
找到图里面的选项,然后输入这两项 glfw3.lib;opengl32.lib
这两个要点击右上角那个带星星的文件夹按钮,然后它会让你选择目录。
包含目录就选我们创建的include文件夹。
库目录就选我们创建的libs文件夹。
接下来我们输入下面的代码:
#include <glad/glad.h> #include <GLFW/glfw3.h> const unsigned int SCR_WIDTH = 800; const unsigned int SCR_HEIGHT = 600; int main() { glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "HelloWorld", NULL, NULL); //创建窗口 return 0; }
如果能够通过,说明你的配置是正确的。
(会一闪而过,你也可以断点,这时候你可以清楚的看到一个命令行窗口和另外一个我们新建的窗口)果没有通过,请返回去检查自己的属性配置和百度自行解决。
接下来,输入我打了一整天的代码! (很烦,好久没用VS了,上面这些步骤我用了半天的时间才弄完)
1 #include <glad/glad.h> 2 #include <GLFW/glfw3.h> 3 #include <iostream> 4 #include<windows.h> 5 int WINAPI MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType); 6 7 void framebuffer_size_callback(GLFWwindow* window, int width, int height);//对窗口注册一个回调函数(Callback Function),它会在每次窗口大小被调整的时候被调用 8 void processInput(GLFWwindow *window);//这个函数将会返回这个按键是否正在被按下。我们将创建一个processInput函数来让所有的输入代码保持整洁。 9 const unsigned int SCR_WIDTH = 800; 10 const unsigned int SCR_HEIGHT = 600; 11 12 void processInput(GLFWwindow *window) 13 //通过glfwSetwindowShouldClose使用把WindowShouldClose属性设置为true的方法关闭GLFW。 14 { 15 if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) { 16 if (MessageBox(NULL, L"你真的要抛弃我吗 我可是你第一个孩子。", L"询问:", MB_YESNO) == IDYES) { 17 glfwSetWindowShouldClose(window, true); 18 } 19 } 20 } 21 void framebuffer_size_callback(GLFWwindow* window, int width, int height) { 22 /*这个帧缓冲大小函数需要一个GLFWwindow作为它的第一个参数,以及两个整数表示窗口的新维度。 23 每当窗口改变大小,GLFW会调用这个函数并填充相应的参数供你处理。*/ 24 glViewport(0, 0, width, height); 25 //尝试在命令行窗口输出宽度与高度 26 std::cout << "当前的窗口大小:" << "宽度: " << width << " 高度: " << height << std::endl; 27 } 28 int main(){ 29 glfwInit(); //初始化GLFW 30 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);//主版本号 31 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 4);//次版本号 32 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//使用核心模式 33 34 #ifdef __APPLE__ 35 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // 如果是MAC,需要这一行 36 #endif 37 38 GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "HelloWorld", NULL, NULL); //创建窗口 39 40 if (window == NULL) {//如果失败了的话 41 std::cout << "真是太失败了,你没能创建窗口成功。" << std::endl; //命令行提示创建失败 42 glfwTerminate(); //滚蛋吧。 43 return -1; 44 } 45 glfwMakeContextCurrent(window);//绑定了Window 46 glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);//我们还需要注册这个函数,告诉GLFW我们希望每当窗口调整大小的时候调用这个函数: 47 48 if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { 49 std::cout << "真是太失败了,GLAD没能初始化成功。" << std::endl; 50 return -1; 51 } 52 53 while (!glfwWindowShouldClose(window)) { 54 //输入控制 55 processInput(window); 56 57 //经过30秒的思考,我终于看懂了这是个什么鬼:这不就是rgba嘛! 58 //你看哦,最后一个值是1! 59 //说明a在后面 60 //如果在前面那就是argb(GDI+_32)那种了。 61 glClearColor(0.2f, 0.3f, 0.3f, 1.0f); 62 //渲染这个颜色 63 glClear(GL_COLOR_BUFFER_BIT); 64 65 glfwPollEvents(); 66 glfwSwapBuffers(window); 67 } 68 glfwTerminate(); //跳出循环后就结束进程 . 69 return 0; 70 }
最终运行图:
补上一个内容:
查看你的显卡对OpenGL的支持
软件的名称 OpenGL Extensions Viewer.
下载链接么,自己去百度吧。