参考教程: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.

下载链接么,自己去百度吧。

OpenGL_构建GLFW与第一个程序的更多相关文章

  1. 跟Google学习Android开发-起始篇-构建你的第一个应用程序(4)

    说明:此系列教程翻译自Google Android开发者官网的Training教程,利用Chome浏览器的自动翻译功能作初译,然后在一些语句不顺或容易造成误解的地方作局部修正.方便英文不好的开发者查看 ...

  2. 深入了解如何构建您的第一个多语言ASP。NET MVC 5 Web应用程序

    下载demo - 3.9 MB 介绍 这篇文章解释了如何创建一个简单的多语言ASP.NET MVC 5 Web应用程序.该应用程序将能够处理英语(美国),西班牙语和法语.英语将是默认语言.当然,扩展解 ...

  3. 面向 Java 开发人员的 Ajax: 构建动态的 Java 应用程序

    面向 Java 开发人员的 Ajax: 构建动态的 Java 应用程序 Ajax 为更好的 Web 应用程序铺平了道路 在 Web 应用程序开发中,页面重载循环是最大的一个使用障碍,对于 Java™ ...

  4. java第一个程序——Hello World

    Hello World 如果没有下载jdk以及配置环境变量的萌新请自行百度,教程非常的详细(参考:https://jingyan.baidu.com/article/6dad5075d1dc40a12 ...

  5. 1. React介绍 React开发环境搭建 React第一个程序

    什么是 React         React 是 Facebook 发布的 JavaScript 库,以其高性能和独特的设计理念受到了广泛关注. React的开发背景         Faceboo ...

  6. 如何使用TDD和React Testing Library构建健壮的React应用程序

    如何使用TDD和React Testing Library构建健壮的React应用程序 当我开始学习React时,我努力的一件事就是以一种既有用又直观的方式来测试我的web应用程序. 每次我想测试它时 ...

  7. Android训练课程(Android Training) - 构建你的第一个应用

    本文翻译自:https://developer.android.com/training/basics/firstapp/index.html 构建你的第一个应用(app) 欢迎来到安卓开发! 这个课 ...

  8. 我的QT5学习之路(二)——第一个程序

    一.前言 “工欲善其事,必先利其器”,上一节,我介绍了Qt的安装和配置方法,搭建了基本的开发平台.这一节,来通过一个简单的例子来了解Qt的编程样式和规范,开始喽~~~ 二.第一个程序——Hello W ...

  9. 用Storyboard构建标签栏多页面应用程序UI

    注: 貌似CSDN的显示效果不佳,假设有须要的话我能够上传pdf格式的: 另外假设文章中有错误还请给位多多提意见,谢谢. pdf格式文档:http://download.csdn.net/detail ...

随机推荐

  1. printf格式输出

    参考:http://www.cplusplus.com/reference/cstdio/printf/ C string that contains the text to be written t ...

  2. win10本机安装rabbitMQ

    在win10环境下安装RabbitMQ的步骤 第一步:下载并安装erlang 原因:RabbitMQ服务端代码是使用并发式语言Erlang编写的,安装Rabbit MQ的前提是安装Erlang. 下载 ...

  3. python socket.io 坑。

    python下star最高的是https://github.com/miguelgrinberg/python-socketio 是flask作者写的.client server都有了,而且还提供了a ...

  4. Gym 100971D 单调栈

    D - Laying Cables Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u ...

  5. 灰度图像--图像分割 阈值处理之OTSU阈值

    学习DIP第55天 转载请标明本文出处:***http://blog.csdn.net/tonyshengtan ***,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:http ...

  6. Jmeter(六)关联之XPath提取器

    如果请求返回的消息为xml或html格式的,可以用XPath提取器来提取需要的数据 以http://www.weather.com.cn/为例: 先新建一个HTTP请求GetCityURL,获取城市天 ...

  7. Maven私服搭建及使用-Windows版

    了解有限,目前只针对基础功能介绍,持续更新 一.下载对应的版本(本例版本:nexus-3.7.1-02) https://www.sonatype.com/download-oss-sonatype ...

  8. Android——NativeActivity - C/C++ Apk开发

    android基本的四大组件之一Activity,android开发的第一个hello world 创建的就是这个继承了Activity类的类,拥有对应的生命周期,由AMS维护,只需要重写父类对应的方 ...

  9. ubuntu下如何检查nvidia显卡驱动是否安装OK?

    答:使用sudo lshw -c video即可,笔者的输出如下: jello~$ sudo lshw -c video*-display description: VGA compatible co ...

  10. android下载网络图片,设置宽高,等比缩放

    使用Picasso组件去下载图片会发现图片宽高会变形不受等比缩放控制,即使设置了图片的 scaleType,可能是对Picasso的api没有用对, Picasso.with(this.activit ...