OpenGL01(你好,窗口)

//  OpenGL01(你好,窗口)


#include <iostream>
//这里须要注意头文件导入顺序,不然编译不能经过
#include "glew.h"
#include "glfw3.h"


/*
    使用简介
 1> GLFW是在openGL里创建窗口用的。跟GLUT/freeglut相似。
 2> GLEW是用来管理OpenGL的函数指针的
 3> openGL都是跟着驱动来的。只要装了显卡驱动,就会有openGL。
 4> 通常来讲假如用来开发的话,GLFW+GLEW+openGL就够用了。GLEW是用来智能载入不少openGL扩展函数(extensions)的。
 5> 编译的时候先载入openGL,而后是GLEW,最后是GLFW。假如是windows的话,也许还须要gdi32。 g++ -Wall -g main.cpp -lglfw -lglew32 -lopengl32 之类的。
 */



/*! @brief The function signature for keyboard key callbacks.
 *
 *  This is the function signature for keyboard key callback functions.
 *
 *  @param[in] window The window that received the event.
 *  @param[in] key The [keyboard key](@ref keys) that was pressed or released.
 *  @param[in] scancode The system-specific scancode of the key.
 *  @param[in] action `GLFW_PRESS`, `GLFW_RELEASE` or `GLFW_REPEAT`.
 *  @param[in] mods Bit field describing which [modifier keys](@ref mods) were
 *  held down.
 *
 *  @sa @ref input_key
 *  @sa glfwSetKeyCallback
 *
 *  @since Added in version 1.0.
 *  @glfw3 Added window handle, scancode and modifier mask parameters.
 *
 *  @ingroup input
 */
//GLFW会在合适的时候调用它,并非由于glfwPollEvents 的触发
//window:当前的窗口 key:按下的键 action:按下仍是释放 mods:是否有Ctrl、Shift、Alt、Super等按钮的操作
//这里咱们监听到了 键盘 esc 被按下去了,而后将windowshouldclose 设置成TRUE,让引擎结束。
void KeyCallback(GLFWwindow* window,int key,int scancode,int action,int mods){
    if (key==GLFW_KEY_ESCAPE && action == GLFW_PRESS) {
        glfwSetWindowShouldClose(window, GL_TRUE);
    }
}

//1>为何须要清空屏幕?
//每个新的渲染开始的时候咱们一般是但愿清一下屏,不然咱们老是能看见上一次的渲染结果。
void clearWindow(){
    //设置一个颜色来清空屏幕
    glClearColor(1, 0.2, 0.2, 1);
    //清空函数,目前咱们仅仅指向清空颜色
    //可能的缓冲位有GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT和GL_STENCIL_BUFFER_BIT。
    glClear(GL_COLOR_BUFFER_BIT);
}


int main(int argc, const char * argv[]) {
    
    //1>初始化glfw并设置
    //实例化glfw
    if (glfwInit()!=GLFW_TRUE) {
        std::cout<<"初始化glfw失败"<<std::endl;
        return -1;
    }
    //配置glfw
    //主版本号设置
    //这里须要注意的是,咱们的主次版本号是根据OpenGL来的,目前咱们用的是2.1版本(目前大部分教程都是针对3.3以上的),因此设置主次版本应该以OpenGL版原本,而不是glfw的版本
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
    //次版本号设置
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
    //设置不可改变大小
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    
    //2>窗口设置并设置
    //建立窗口对象
    //GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share)
    //参数依次为:窗口的宽,窗口的高,窗口的title,未知,未知。
    GLFWwindow * window = glfwCreateWindow(800, 600, "hello window", nullptr, nullptr);
    if (window==nullptr) {
        std::cout<<"初始化窗口失败"<<std::endl;
        return -1;
    }
    //通知glfw将窗口的上下文设置成当前线程的主上下文
    glfwMakeContextCurrent(window);
    
    //3>glew设置并设置
    //glew管理OpenGL的函数指针。glewExperimental设置成TRUE是为了让glew管理OpenGL函数指针的时候更多的使用现代化的技术,若是设置成FALSE可能会在使用OpenGL核心模式时出现问题。
    glewExperimental = GL_TRUE;
    if (glewInit()!=GLEW_OK) {
        std::cout<<"初始化glew失败"<<std::endl;
        return -1;
    }
    
    //4>视口设置viewport(告诉OpenGL渲染的窗口的尺寸大小,及渲染的位置。即:设置窗口的维度)
    //获取窗口大小
    int width,height;
    glfwGetFramebufferSize(window, &width, &height);
    //给视口视图设置位置及其大小
    //glViewport (GLint x, GLint y, GLsizei width, GLsizei height)
    //x,y 表示视口视图相对于窗口的位置(0,0)表示在左下角;width,height是视口视图的宽高,这里咱们从窗口获取大小而不直接用窗口的800*600 是为了让他能在高的DPI屏幕上(例如Apple的视网膜显示屏)也能正常工做
    //固然,咱们也能够设置宽高小一点 这样在窗口上就会小一点显示
    //OpenGL的坐标范围是【-1,1】,对应的范围映射的坐标是【0,800】,【0,600】
    glViewport(0, 0, width, height);
    
    //5>注册咱们函数回调
    glfwSetKeyCallback(window, KeyCallback);
    
    //6>准备引擎。目的是为了函数可以不断的绘制并能接收用户输入。而不是渲染了一次就程序退出关闭窗口了
    while (!glfwWindowShouldClose(window)) {
        //检查有没有什么事件被触发(键盘,鼠标等),而后调用对应的回到函数
        glfwPollEvents();
        
        
        //7>这里就是咱们最终要的渲染指令了
        //这里咱们写一个自定义颜色清空屏幕测试
        clearWindow();
        
        //交换颜色缓冲。
        //为何使用交换颜色缓冲?
        //应用程序使用单缓冲绘图时可能会产生图像闪烁的问题,由于图像是从左到右,由上到下逐像素绘制而成,不是一瞬间就展现给用户。因此咱们一般使用的是双缓冲渲染,前缓冲保存着最终渲染好的图像用于窗口显示,而渲染指令都会在后缓冲上绘制,当全部的渲染指令完成之后咱们将先后缓冲交换(swap),这样图像就显示出来了。
        glfwSwapBuffers(window);
    }
    
    //6>当循环结束后,咱们须要释放glfw的内存
    glfwTerminate();
    return 0;
}
从零开始学习OpenGL
我的博客:http://www.cnblogs.com/fusheng-it/
参考文献:https://learnopengl-cn.github.io/
QQ群:209162510(新建立的群)
相关文章
相关标签/搜索