• vs中使用openGL


    一、准备工作

    创建Empty Project,为了能够使用OpenGL的库函数,需要把相关的库连接到项目中:
    1、首先添加库的路径
    如上,可以把需要添加的include、lib放到一起比较方便管理
    这时候,VS就能找到所有需要的文件了。
    2、然后把相关库链接到项目中,
     
    注:GLFW是一个C写的专门用于OpenGL开发的库,它只提供把物体渲染到屏幕所需的必要功能。它可以给我们创建一个OpenGL环境,定义窗口参数,以及相应用户输入,这些都是必要的功能。
    本节使用GLFW,但是链接的时候除了GLFW,把OpenGL库也添加上了,这里,OpenGL库的添加是和操作系统有关的。
    本文使用的是windows,Microsoft SDK提供了一个opengl32.lib,是vs自带的,所以我们这里链接的是opengl32.lib。
    另外,对于不同版本的OpenGL,管理各个版本之间函数调用,通过GLEW这个库实现,也需要添加这个的链接。

    如果你使用GLEW的静态库,我们必须在包含GLEW之前定义一个预处理变量GLEW_STATIC。

    #DEFINE GLEW_STATIC
    #include <GL/glew.h>
    
    至此,我们的准备工作已经完成。
     
    ---------------

    glfw是辅助创建openGL窗口的开源库.所以在后面配置工程的时候你会发现我们根本就不需要用到MFC窗口框架的,只需要console工程即可

    glew是暴露openGL的通用API的开源库,

    glm是openGL开发中常用的数学库,主要是一些矩阵变化. 但是该库里面的源文件都是以.hpp这种不用编译的后缀形式存在,所以只要include就行,在此环境配置中不用理会.

    ---------------

    二、openGL操作过程

    1、初始化、配置GLFW
    2、初始化、配置GLEW
    3、设置窗口维度
    4、消息循环、渲染
    5、释放资源
    相应例子代码:
    // GLEW
    #define GLEW_STATIC
    #include <GL/glew.h>
    
    // GLFW
    #include <GLFW/glfw3.h>
    
    #include<iostream>
    //Function prototypes
    void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);
    
    // Window dimensions
    const GLuint WIDTH = 800, HEIGHT = 600;
    
    // The MAIN function, from here we start the application and run the game loop
    int main()
    {
        std::cout << "Starting GLFW context, OpenGL 3.3" << std::endl;
        // 初始化GLFW
        glfwInit();  
        // 配置 GLFW
        glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
        glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
        glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
        glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    
        // 创建 GLFW 窗口
        GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr);
        if (window == nullptr)
        {
            std::cout << "Failed to create GLFW window" << std::endl;
            glfwTerminate();
            return -1;
        }
        //通知GLFW将我们窗口的上下文设置为当前线程的主上下文
        glfwMakeContextCurrent(window);
    
        // 为窗口设置回调函数(事件响应)
        glfwSetKeyCallback(window, key_callback);
    
        // 让GLEW在管理OpenGL的函数指针时更多地使用现代化的技术
        glewExperimental = GL_TRUE;
        // 初始化GLEW
        if (glewInit() != GLEW_OK)
        {
            std::cout << "Failed to initialize GLEW" << std::endl;
            return -1;
        }
    
        //设置窗口的维度,即告诉OpenGL渲染窗口的尺寸大小
        //我们实际上也可以将视口的维度设置为比GLFW的维度小,
        //这样子之后所有的OpenGL渲染将会在一个更小的窗口中显示,
        //这样子的话我们也可以将一些其它元素显示在OpenGL视口之外。
        int width, height;
        glfwGetFramebufferSize(window, &width, &height);
        glViewport(0, 0, width, height);
    
        // 游戏循环
        while (!glfwWindowShouldClose(window))
        {
            //检查有没有触发什么事件(比如键盘输入、鼠标移动等),然后调用对应的回调函数
            glfwPollEvents();
    
            // Render
            // Clear the colorbuffer
            glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
            glClear(GL_COLOR_BUFFER_BIT);
    
            // 交换颜色缓冲
            glfwSwapBuffers(window);
        }
    
        // 释放/删除之前的分配的所有资源
        glfwTerminate();
        return 0;
    }
    
    // Is called whenever a key is pressed/released via GLFW
    void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
    {
        std::cout << key << std::endl;
        if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
            glfwSetWindowShouldClose(window, GL_TRUE);
    }
    

    作者:禅在心中

    出处:http://www.cnblogs.com/pinking/

    本文版权归作者和博客园共有,欢迎批评指正及转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    BeanPostProcessor后置处理器原理以及ApplicationListener原理
    SpringCloud之服务注册与发现Eureka+客户端Feign
    AJPFX关于TreeSet集合的介绍
    AJPFX:关于面向对象的封装
    AJPFX总结Java 类与对象的初始化
    AJPFX关于增强for的概述和使用(foreach)
    AJPFX总结泛型概念和使用
    AJPFX简述可变参数概述和使用
    AJPFX关于JAVA StringBuffer的用法总结
    AJPFX关于Collection 集合的表述
  • 原文地址:https://www.cnblogs.com/pinking/p/6179639.html
Copyright © 2020-2023  润新知