如何配置OPENGL可以参考:https://www.cnblogs.com/hjd21/p/12431381.html;

另外强烈推荐一个从入门到入土的教程:https://learnopengl-cn.github.io/

笔记在代码注释里。

#include"includes/glad.h"
#include "includes/glfw3.h"
#include<ctime>
#include <iostream>

void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow* window);

// settings
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;

int main()
{
    srand((int)(time(NULL)));
    // glfw: 对glfw的初始化
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); //告诉glfw使用的opgl(glad)主版本是3
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//告诉glfw使用的opgl(glad)次版本是3
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//告诉glfw我们使用的是核心模式,意味着我们只能使用OpenGL功能的一个子集

    //创建窗口对象(本质为一typedef struct),函数参数分别是宽、高(不是像素)、窗口名称、?、?,返回对象的指针地址,后者是函数。
    GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "dawn666", NULL, NULL);
    //看窗口是否创建失败。
    if (window == NULL)
    {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }

    glfwMakeContextCurrent(window);//真正设置窗口的函数,window只是定义的结构体。
    //我们还需要注册window这个窗口的回调(视口)函数,使得实现窗口大小改变,视口同调。
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);//使用window的宽高并调用回调函数。
    //GLAD是用来加载管理OpenGL的函数指针的,所以在调用任何OpenGL的函数之前我们需要初始化GLAD,初始化失败就会终止。
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }
    // 渲染循环render loop
    // -----------
    while (!glfwWindowShouldClose(window))
    {
        // 通过函数调用判断用户是否按下ESC,按下则设置参数为该窗口可以关闭。
        // -----
        processInput(window);

        // render渲染循环
        // ------
        glClearColor((float)(rand()%500)/500, (float)(rand() % 500) / 500, (float)(rand() % 500) / 500, (float)(rand() % 500) / 500);//清空窗口的后缓冲,并设置后缓冲所用的颜色值。
        glClear(GL_COLOR_BUFFER_BIT);//清空窗口前缓冲缓冲。
        //glfwWindowShouldClose函数在我们每次循环的开始前检查一次GLFW是否被要求退出,如果是的话该函数返回true然后渲染循环便结束了,之后为我们就可以关闭应用程序了。
        //glfwPollEvents函数检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,并调用对应的回调函数(可以通过回调方法手动设置)。
        //glfwSwapBuffers函数会交换颜色缓冲(它是一个储存着GLFW窗口每一个像素颜色值的大缓冲),它在这一迭代中被用来绘制,并且将会作为输出显示在屏幕上。
        glfwSwapBuffers(window);//交换前后缓冲
        glfwPollEvents();
    }
    //当渲染循环结束后我们需要正确释放/删除之前的分配的所有资源。我们可以在main函数的最后调用glfwTerminate函数来完成。
    //----------------------------------------------------------------------------
    glfwTerminate();
    return 0;
}
void processInput(GLFWwindow* window)//是否退出窗口
{
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, true);
}
//当用户改变窗口的大小的时候,视口也应该被调整。我们可以对窗口注册一个回调函数(Callback Function),它会在每次窗口大小被调整的时候被调用。
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    glViewport(0, 0, width, height);//glViewport函数前两个参数控制窗口左下角的位置。第三个和第四个参数控制渲染窗口的宽度和高度(像素)。
    //*我们实际上也可以将视口的维度设置为比GLFW的维度小,这样子之后所有的OpenGL渲染将会在一个更小的窗口中显示,这样子的话我们也可以将一些其它元素显示在OpenGL视口之外。
}

 

 posted on 2020-10-17 11:11  梦醒夜续zz  阅读(267)  评论(0)    收藏  举报