• 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)

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

          

  • 相关阅读:
    Compression algorithm (deflate)
    tcpip数据包编码解析(chunk and gzip)_space of Jialy_百度空间
    What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings?
    gzip压缩算法: gzip 所使用压缩算法的基本原理
    Decompressing a GZip Stream with Zlib
    Frequently Asked Questions about zlib
    how to decompress gzip stream with zlib
    自己动手写web服务器四(web服务器是如何通过压缩数据,web服务器的gzip模块的实现)
    What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings?
    C语言抓http gzip包并解压 失败 C/C++ ChinaUnix.net
  • 原文地址:https://www.cnblogs.com/Ziyo/p/9630855.html
Copyright © 2020-2023  润新知