OpenGL--------第一个窗口

Posted ziyo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenGL--------第一个窗口相关的知识,希望对你有一定的参考价值。

任务

      开始对OpenGL的学习,今天的任务是在VS2017中配置OpenGL的库(GLFW,GLEW)并创建第一个窗口。

      

搭建环境

      1.获取GLFW库

            从官方网站下载预编译的二进制版本和相应头文件,也可以下载源码包再进行编译(不建议)。

      2.将GLFW链接进工程

            工程属性(Project Properties) --> VC++目录 --> 包含目录/库目录 (如下图1)

            将include目录(包含glfw.h)的地址加入包含目录中

            将库目录(包含glfw.lib)的地址加入库目录中

            工程属性-->连接器-->输入-->附加依赖项-->将库名称加入附加依赖项中(如下图2)

【图1】

技术分享图片

【图2】

技术分享图片

 

      3.获取GLEW

            从官方网站下载预编译的二进制版本和相应头文件,也可以下载源码包再进行编译(不建议)。

      4.将GLEW链接进工程-----------同2

      5.将glew32s.lib连接进工程----Visual Studio默认安装opengl32.lib库,直接加入附加依赖项即可。

 

代码实现

 1 // GLEW 使用静态链接库
 2 #define GLEW_STATIC
 3 #include<GL/glew.h>
 4 
 5 // GLFW
 6 #include<GLFWglfw3.h>
 7 
 8 #include<iostream>
 9 using namespace std;
10 
11 int main()
12 {
13     glewInit();
14     // 初始化GLFW
15     glfwInit();
16     // 配置GLFW--告诉GLFW使用OpenGL版本为3.3
17     // 确定主版本号(Mjaor)
18     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
19     // 确定副版本号 (Minor)
20     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
21     // 明确告诉GLFW使用核心模式,使用旧版函数将导致invalid operation(无效操作)
22     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
23     // 不允许用户调整窗口大小
24     glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
25 
26     // 创建窗口对象,设定窗口宽,高,名称  nullptr--空指针
27     GLFWwindow* window = glfwCreateWindow(800, 600, "Hello,OpenGL", nullptr, nullptr);
28     if (window == nullptr)
29     {
30         std::cout << "Failed to create GLFW window" << std::endl;
31         glfwTerminate();
32         return -1;
33     }
34 
35 
36     // 初始化GLEW
37     // 设置glewExperimental值为GL_TURE,是的GLEW在管理OpenGL的函数指针时更多使用现代化技术
38     // 如果设值为GL_FALSE的话可能会在使用OpenGL的核心模式时出现问题
39     glewExperimental = GL_TRUE;
40     if (glewInit() != GLEW_OK)
41     {
42         std::cout << "Faild to initialize GLEW" << std::endl;
43         return -1;
44     }
45 
46     // 获取窗口尺寸,大小
47     int width, height;
48     glfwGetFramebufferSize(window, &width, &height);
49     //  告诉OpenGL渲染窗口的尺寸大小--前两个参数控制窗口左下角的位置--取值范围[-1,1],映射到屏幕坐标[0, 800], [0,600]
50     //                                后两个参数控制渲染窗口的宽度和高度
51     glViewport(0, 0, width, height);
52 
53     // glfwWindowShouldClose 检查GLFW是否被要求退出
54     while (!glfwWindowShouldClose(window))
55     {
56         // 检测事件触发
57         glfwPollEvents();
58         // 交换颜色缓冲(时一个储存GLFW窗口每一个像素颜色的大缓冲),在迭代中被用作绘制,并将输出显示在屏幕
59         glfwSwapBuffers(window);
60     }
61 
62     glfwTerminate();
63     return 0;
64 }

 

 

错误总结

      1.获取glfw,glew库时,没必要下载源代码使用cmake编译,费时且效果不佳。

      2.添加glew依赖项,库目录路径不对,报错如下。

       技术分享图片

      3.与其他库的使用冲突,

        解决:工程-->属性-->连接器-->输入-->忽略特定默认库   加入冲突的默认库名称

        技术分享图片

      4.未链接opengl32.lib库,报错如下。

       技术分享图片

      5.调试时,窗口闪退,报错类似如下。(部分解决)

       技术分享图片

       解决:调试-->选项和设置 -->调试-->常规-->勾上启动原服务器支持-->常规-->符号-->勾选Microsoft符号服务器

                  原方案(https://blog.csdn.net/acliyu/article/details/78795869)

       仍存在问题,如下,暂不能解决。

      技术分享图片

 

以上是关于OpenGL--------第一个窗口的主要内容,如果未能解决你的问题,请参考以下文章

正在渲染opengl的随机屏幕片段-这表明啥错误?

OpenGL 片段着色器未写入 fbo 颜色缓冲区

OpenGL--------第一个窗口

OpenGL学习—— 创建第一个窗口

OpenGL:基本图形绘画二

✠OpenGL-2-图像管线