美文网首页终端研发部
OpenGL学习笔记——上色

OpenGL学习笔记——上色

作者: oceanLong | 来源:发表于2016-11-24 23:37 被阅读330次

    前言

    初学OpenGL,我越来越觉得学习OpenGL的过程,像一个小朋友学画画(我就是那个小朋友!)一开始,只画找来一张纸(窗体),在上面随便的涂抹上色,然后学着画规则物体,三角形、圆形等,接着学习画一些具有透视的3D场景,最后越画越接近真实的物理效果。

    正所谓万事开头难,上一篇写了如何配置OpenGL的环境,相当于学会了如何展开一张画,这次要开始记录如何握笔。

    参考教程

    正文

    <b>需求:</b>创建一个指定大小的窗体,并涂满指定的颜色。按ESC键退出窗体。

    #include "stdafx.h"  
    // GLEW
    #define GLEW_STATIC
    #include <GL/glew.h>
    
    // GLFW
    #include <GLFW/glfw3.h>
    #include <iostream>
    using namespace std;
    
    // GL窗体的按钮回调
    void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);
    
    // Window dimensions
    const GLuint WIDTH = 800, HEIGHT = 600;
    

    第一部分比较简单,包含了必须的库,然后声明了按键回调,为了实现ESC退出窗体,同时定义了窗体的宽高。

    int main(void)
    {
        glfwInit();
        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主要是为我们提供窗口的库,我们调用glfwInit();初始化,然后通过

    GLFWAPI void glfwWindowHint(int hint, int value);
    

    配置glfw窗口的相关属性。与通常的配置一样,glfwWindowHint方法的第一个参数是配置项,第二个参数是配置项的值。
    上面这段代码的前两句,分别配置了glfwWindow的主版本号和副版本号,因此,我们告诉glfw,我们使用的OpenGL是3.3版本的。
    第三句表示,我们只使用当前版本未被废弃的特性。
    第四句表示,我们的窗体不允许被手动缩放(初学为了简化难度,忽略缩放问题)。

        ...
        // Create a GLFWwindow object that we can use for GLFW's functions
        GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr);
    
        if (window == nullptr)
        {
            std::cout << "Failed to create GLFW window" << std::endl;
            glfwTerminate();
            return -1;
        }
        // Make the context of the specified window current on the calling thread
        glfwMakeContextCurrent(window);
        glfwSetKeyCallback(window, key_callback);
        ...
    

    上面的代码中,我们调用

    GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share);
    

    创建了我们的GLFW窗体。
    这个方法中,前两个参数是窗体的宽高;
    第三个参数是窗体的名字;
    第四个参数是显示器相关参数,我们暂时不需要,当我们要创建全屏窗体时可能会用到。
    第五个参数可以传入一个已经创建的窗体,并分享它的一些属性给当前要创建的窗体,我们暂时也不需要。

    完成窗体的创建之后,我们先对创建过程进行一次检查。如果创建失败就直接终止程序。
    如果创建成功,我们继续往下,调用

    GLFWAPI void glfwMakeContextCurrent(GLFWwindow* window);
    

    使我们创建的窗体的上下文到调用的线程上。

    glfwSetKeyCallback(window, key_callback);
    

    调用GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun cbfun);使窗口监听键盘按键。第一个参数是窗体对象,第二个参数是我们声明的按键回调函数。

    至此,一个基本的窗体就创建完成,接下来就是在上面布满颜色。

    while (!glfwWindowShouldClose(window))
        {
            // Check if any events have been activiated (key pressed, mouse moved etc.) and call corresponding response functions
            glfwPollEvents();
    
            // Clear the colorbuffer
            glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
            glClear(GL_COLOR_BUFFER_BIT);
    
            // Swap the screen buffers
            glfwSwapBuffers(window);
        }
    

    判断glfw窗口是否应该关闭。然后进行循环。
    glfwPollEvents()监听所有事件,包括键盘点击和鼠标移动。
    GLAPI void GLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);清除屏幕,同时可以设置清除屏幕的颜色的ARGB值。
    GLAPI void GLAPIENTRY glClear (GLbitfield mask);清除gl的数据,可以通过输入的标志位决定清除数据的类型,例如glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)表示要清除颜色缓冲以及深度缓冲。
    GLFWAPI void glfwSwapBuffers(GLFWwindow* window);交换缓存区,执行刷新操作。
    由于,我们采用双缓冲的结构,交换缓存时,我们就可以刷新窗口。

        glfwTerminate();
    

    结束循环后,终止OpenGL。

    最终,我们就可以打开一个窗体,并涂上固定的颜色。

    最后结果

    以上。

    相关文章

      网友评论

        本文标题:OpenGL学习笔记——上色

        本文链接:https://www.haomeiwen.com/subject/faovpttx.html