OpenGl L1窗口创建

一.创建你的窗口

在画出效果图之前,首先要做的就是创建一个OpenGl上下文和一个用于显示的窗口

//窗口创建头文件
#include <glad/glad.h>
#include <GLFW/glfw3.h>
//实例化窗口
int main()
{
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    //使用核心模式
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE)
//...
return 0;
}
  • 接下来创建窗口对象:
//窗口创建头文件
#include <glad/glad.h>
#include <GLFW/glfw3.h>
//实例化窗口
int main()
{
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    //使用核心模式
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE)

    //glfCreateWindow函数设置窗口的宽和高,以及标题
    //GLFWwindow类存放窗口对象的指针
    GLFWwindow* window = glfwCreateWindow(800,600,"LearnOPenGL",NULL,NULL);
    if(window == NULL)
    {
    std::cout<<"faild"<<std::endl;
    return -1;
    }
    //将当前窗口的上下文设置为当前线程的上下文,上下文:OpenGL在其中存储渲染信息的一个数据结构
    glfwMakeContextCurrent(window);
//...
return 0;
}
  • 然后初始化GLAD用于管理函数指针
//窗口创建头文件
#include <glad/glad.h>
#include <GLFW/glfw3.h>
//实例化窗口
int main()
{
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    //使用核心模式
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE)

    //glfCreateWindow函数设置窗口的宽和高,以及标题
    //GLFWwindow类存放窗口对象的指针
    GLFWwindow* window = glfwCreateWindow(800,600,"LearnOPenGL",NULL,NULL);
    if(window == NULL)
    {
    std::cout<<"faild"<<std::endl;
    return -1;
    }
    //将当前窗口的上下文设置为当前线程的上下文,上下文:OpenGL在其中存储渲染信息的一个数据结构
    glfwMakeContextCurrent(window);

   //初始化GLAD
  if (!gladLoadGLLoadwe((GLADloadproc)glfwGetProcAddress))
  {
    std::cout<<"Faild"<<std::endl;
    return -1;
  }
//...
return 0;
}

  • 设置渲染窗口的大小,也叫做“视口”
//窗口创建头文件
#include <glad/glad.h>
#include <GLFW/glfw3.h>
//设置一个窗口回调函数
void framebuffer_size_callback(GLFWwindow* window ,int width ,int height);
framebuffer_size_callback(GLFWwindow* window ,int width ,int height)
{
  glViewport(0,0,width,height);
}
//实例化窗口
int main()
{
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    //使用核心模式
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE)

    //glfCreateWindow函数设置窗口的宽和高,以及标题
    //GLFWwindow类存放窗口对象的指针
    GLFWwindow* window = glfwCreateWindow(800,600,"LearnOPenGL",NULL,NULL);
    if(window == NULL)
    {
    std::cout<<"faild"<<std::endl;
    return -1;
    }
    //将当前窗口的上下文设置为当前线程的上下文,上下文:OpenGL在其中存储渲染信息的一个数据结构
    glfwMakeContextCurrent(window);

   //初始化GLAD
  if (!gladLoadGLLoadwe((GLADloadproc)glfwGetProcAddress))
  {
    std::cout<<"Faild"<<std::endl;
    return -1;
  }

  //设置渲染窗口,p1,p2设置窗口左下角的位置,p3,p4设置窗口的宽度和高度(按像素算)
  glViewport(0,0,800,600);
  //使用这个函数可以调用设置视口的函数
  //glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
//...
return 0;
}

  • 我们不希望这个程序执行一下就结束掉,所以我们应该加入一个渲染循环用于持续渲染我们的视口
//窗口创建头文件
#include <glad/glad.h>
#include <GLFW/glfw3.h>
//设置一个窗口回调函数
void framebuffer_size_callback(GLFWwindow* window ,int width ,int height);
framebuffer_size_callback(GLFWwindow* window ,int width ,int height)
{
  glViewport(0,0,width,height);
}
//实例化窗口
int main()
{
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    //使用核心模式
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE)

    //glfCreateWindow函数设置窗口的宽和高,以及标题
    //GLFWwindow类存放窗口对象的指针
    GLFWwindow* window = glfwCreateWindow(800,600,"LearnOPenGL",NULL,NULL);
    if(window == NULL)
    {
    std::cout<<"faild"<<std::endl;
    return -1;
    }
    //将当前窗口的上下文设置为当前线程的上下文,上下文:OpenGL在其中存储渲染信息的一个数据结构
    glfwMakeContextCurrent(window);

   //初始化GLAD
  if (!gladLoadGLLoadwe((GLADloadproc)glfwGetProcAddress))
  {
    std::cout<<"Faild"<<std::endl;
    return -1;
  }

  //设置渲染窗口,p1,p2设置窗口左下角的位置,p3,p4设置窗口的宽度和高度(按像素算)
  glViewport(0,0,800,600);
  //使用这个函数可以调用设置视口的函数
  //glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

 //加入循环
 while(!glwWindowShouldClose(window)) //用于检查window对象是否还在,也就是还没退出渲染
 {
   glfwSwapBuffers(window);//用于交换前缓存和后缓存:也就是绘制图像的过程
   glfwPollEvents();//用于检测有没有什么触发事件,并更新窗口状态
  }
//...
return 0;
}

  • 最后就是我们渲染结束后,要释放分配的所有资源。
//窗口创建头文件
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
//设置一个窗口回调函数
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
   glViewport(0, 0, width, height);
}
//实例化窗口
int main()
{
   glfwInit();
   glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
   glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
   //使用核心模式
   glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

       //glfCreateWindow函数设置窗口的宽和高,以及标题
       //GLFWwindow类存放窗口对象的指针
       GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOPenGL", NULL, NULL);
   if (window == NULL)
   {
       std::cout << "faild" << std::endl;
       return -1;
   }
   //将当前窗口的上下文设置为当前线程的上下文,上下文:OpenGL在其中存储渲染信息的一个数据结构
   glfwMakeContextCurrent(window);

   //初始化GLAD
   if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
   {
       std::cout << "Faild" << std::endl;
       return -1;
   }

   //设置渲染窗口,p1,p2设置窗口左下角的位置,p3,p4设置窗口的宽度和高度(按像素算)
   glViewport(0, 0, 800, 600);
   //使用这个函数可以调用设置视口的函数
   //glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

  //加入循环
   while (!glfwWindowShouldClose(window)) //用于检查window对象是否还在,也就是还没退出渲染
   {
       glfwSwapBuffers(window);//用于交换前缓存和后缓存:也就是绘制图像的过程
       glfwPollEvents();//用于检测有没有什么触发事件,并更新窗口状态
   }

   //释放资源
   glfwTerminate();
   //...
   return 0;
}

最后就会得到这样一个黑窗口了。
在这里插入图片描述

二.控制你的窗口

如果我们要通过按键对窗口进行控制的话,我们定义了一个函数用于检测这个动作

//窗口创建头文件
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
//设置一个窗口回调函数
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    glViewport(0, 0, width, height);
}
//检测用户输入
void processInput(GLFWwindow *window)
{
  if(glfwGetKey(window,GLFW_KEY_ESCAPE) == GLFW_PRESS)
    glfwSetWindowShouldClose(window,true);
 }
//实例化窗口
int main()
{
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    //使用核心模式
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

        //glfCreateWindow函数设置窗口的宽和高,以及标题
        //GLFWwindow类存放窗口对象的指针
        GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOPenGL", NULL, NULL);
    if (window == NULL)
    {
        std::cout << "faild" << std::endl;
        return -1;
    }
    //将当前窗口的上下文设置为当前线程的上下文,上下文:OpenGL在其中存储渲染信息的一个数据结构
    glfwMakeContextCurrent(window);

    //初始化GLAD
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Faild" << std::endl;
        return -1;
    }

    //设置渲染窗口,p1,p2设置窗口左下角的位置,p3,p4设置窗口的宽度和高度(按像素算)
    glViewport(0, 0, 800, 600);
    //使用这个函数可以调用设置视口的函数
    //glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

   //加入循环
    while (!glfwWindowShouldClose(window)) //用于检查window对象是否还在,也就是还没退出渲染
    {
        //在渲染中不断检测用户动作
        processInput(window);
        glfwSwapBuffers(window);//用于交换前缓存和后缓存:也就是绘制图像的过程
        glfwPollEvents();//用于检测有没有什么触发事件,并更新窗口状态
    }

    //释放资源
    glfwTerminate();
    //...
    return 0;
}
  • 我们希望在每次循环渲染的过程中将前一次的渲染图清空,所以需要对缓存进行调用
//窗口创建头文件
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
//设置一个窗口回调函数
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    glViewport(0, 0, width, height);
}
//检测用户输入
void processInput(GLFWwindow *window)
{
  if(glfwGetKey(window,GLFW_KEY_ESCAPE) == GLFW_PRESS)
    glfwSetWindowShouldClose(window,true);
 }
//实例化窗口
int main()
{
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    //使用核心模式
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

        //glfCreateWindow函数设置窗口的宽和高,以及标题
        //GLFWwindow类存放窗口对象的指针
        GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOPenGL", NULL, NULL);
    if (window == NULL)
    {
        std::cout << "faild" << std::endl;
        return -1;
    }
    //将当前窗口的上下文设置为当前线程的上下文,上下文:OpenGL在其中存储渲染信息的一个数据结构
    glfwMakeContextCurrent(window);

    //初始化GLAD
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Faild" << std::endl;
        return -1;
    }

    //设置渲染窗口,p1,p2设置窗口左下角的位置,p3,p4设置窗口的宽度和高度(按像素算)
    glViewport(0, 0, 800, 600);
    //使用这个函数可以调用设置视口的函数
    //glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

   //加入循环
    while (!glfwWindowShouldClose(window)) //用于检查window对象是否还在,也就是还没退出渲染
    {
        //在渲染中不断检测用户动作
        processInput(window);
        glfwSwapBuffers(window);//用于交换前缓存和后缓存:也就是绘制图像的过程
        glfwPollEvents();//用于检测有没有什么触发事件,并更新窗口状态   
   //清空缓存并设置一个默认缓存色
   glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
   glClear(GL_COLOR_BUFFER_BIT);
   //这里是对颜色缓存进行清空,其他还有深度缓等GL_DEPTH_BUFFER_BIT和GL_STENCIL_BUFFER_BIT
    }

    //释放资源
    glfwTerminate();
    //...
    return 0;
}

得到这个结果:
在这里插入图片描述