创建一个窗口

来源:互联网 发布:凸轮弹簧机编程 编辑:程序博客网 时间:2024/04/29 18:51

OPENGL简介

通俗来讲OPENGL就是一套图形API的集合,其实不单单是这样,它也是API执行的规范。OPENGL整体其实是一个巨大的状态机(State Machine),根据一系列变量的值来确定OPENGL的行为,这些不同的状态我们统称为OPENGL上下文(Context)。OPENGL里面含有很多不同的Object。每个对象都代表一个状态,通过设置很多对象,来让OPENGL执行不同的功能。

OPENGL环境安装

OpenGL环境开发工具包

我的环境是:Win10+vs2015+GTX970M+OPENGL3.3,要想在电脑上可以跑OPENGL的程序,首先需要配置OPENGL需要的一些扩展库
  1. GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入。首先我们需要下载这样的一个库需要用到里面的include文件夹里面的内容和编译之后生成的库。(其实这个库最好还是在自己的电脑上亲自编译一下,这样可能会避免以后出现的不必要的错误,我们可以使用一个叫做CMake的东西来做这些事情,首先我们打开下载的CMake的GUI启动方式,然后我们在glfw文件夹下面创建一个叫做build的文件夹,这个文件夹存放CMake生成的lib库文件要以及其他的文件,然后把glfw目录作为源目录,目标目录选为build,然后Configure,Configure,Generate)生成完毕之后你可以在build目录之后看到GLFW.sln,用vs打开,然后运行,生成库文件glfw3.lib(因为我们用的OPENGL3.3),这个库文件在src的Debug目录下。好了,生成了这些我们所要的文件之后我们就需要导入vs以便让我们的项目可以顺利运行。
    1. 找到IDE或者编译器的/lib/include文件夹,添加GLFW的include文件夹里的文件到IDE的/include文件夹里去。用类似的方法,将glfw3.lib添加到/lib文件夹里去。虽然这样能工作,但这不是推荐的方式,因为这样会让你很难去管理库和include文件,而且重新安装IDE或编译器可能会导致这些文件丢失。
    2. 推荐的方式是建立一个新的目录包含所有的第三方库文件和头文件,并且在你的IDE或编译器中指定这些文件夹。我个人会使用一个单独的文件夹,里面包含LibsInclude文件夹,在这里存放OpenGL工程用到的所有第三方库和头文件。这样我的所有第三方库都在同一个位置(并且可以共享至多台电脑)。然而这要求你每次新建一个工程时都需要告诉IDE/编译器在哪能找到这些目录。
    然后我们用vs新建一个Visual C++的空项目,我们进入项目的属性里面

    然后选择VC++ Directories(VC++ 目录)选项卡(如下图)。在下面的两栏添加目录:

    这里你可以把自己的目录加进去,让工程知道到哪去搜索。你需要手动把目录加在后面(这样的方式是对上面的2的设置方法)

对于1来说需要在Linker(链接器)选项卡里的Input(输入)选项卡里添加glfw3.lib这个文件:

要链接一个库我们必须告诉链接器它的文件名。库名字是glfw3.lib,我们把它加到Additional Dependencies(附加依赖项)字段中

现在GLFW库的安装已经完成了。

2.OpenGL库

对于windows系统来说安装vs的时候OpenGl32.lib已经包含在Microsoft SDK里面了,我们只需要把opengl32.lib写进Additional Dependencies(附加依赖项)字段中就可以了。

3.glew库

glew库的安装和glfw差不多,把include文件夹里面的内容放到vs安装目录下的include里面。然后把glew32s.lib放入lib文件夹里面,最后在项目的Additional Dependencies(附加依赖项)写进去就可以了。

4.glm库

这个是OpenGL的数学库,这个库安装起来要方便许多,只需要把里面的include文件夹里面的内容放到vs的include里面就可以了。

以上就是基本库的安装,接下来我们创建一个空窗口的程序。

#include "iostream"//GLEW#define GLEW_STATIC#include "GL/glew.h"//GLFW#include "GLFW/glfw3.h"int main(){glfwInit();//初始化GLFWglfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//声明opengl的主版本号和次版本号glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//声明opengl为核心模式glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);//窗口不可变换大小//接下来创建一个窗口对象GLFWwindow* window = glfwCreateWindow(800, 600, "zzj's opengl", nullptr, nullptr);if (window == nullptr){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();//结束窗口,释放资源return -1;}glfwMakeContextCurrent(window);//将当前窗口设置主线程的上下文glewExperimental = GL_TRUE;//这是初始化opengl指针if (glewInit() != GLEW_OK){std::cout << "Failed to initialize GLEW" << std::endl;return -1;}int width, height;glfwGetFramebufferSize(window, &width, &height);glViewport(0, 0, width, height);//设置窗口的维度while (!glfwWindowShouldClose(window)){glfwPollEvents();//检查触发事件glfwSwapBuffers(window);//交换颜色缓冲,重绘}glfwTerminate();//释放资源return 0;}



1 0
原创粉丝点击