首页 > 其他分享 >OpenGL入门——第一个窗口

OpenGL入门——第一个窗口

时间:2023-08-05 14:00:39浏览次数:27  
标签:窗口 入门 OpenGL GLFWwindow window GLFW 函数

先初始GLFW窗口

  ///窗口初始化
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//主版本号,当API以不兼容的方式更改时,该值会增加。
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//次版本号,当特性被添加到API中时,它会增加,但是它保持向后兼容。
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//使用核心模式,不兼容已废弃函数

 

然后创建一个窗口化对象

  GLFWwindow* window = glfwCreateWindow(800, 600, "ping-window", NULL, NULL);
    if (window == NULL)
    {
        std::cout << "failed to create GLFW window" << std::endl;
        glfwTerminate();//释放/删除之前的分配的所有资源
        return nullptr;
    }
  glfwMakeContextCurrent(window);//将窗口的上下文设置为当前线程的主上下文

 

因为GLAD是用来管理OpenGL的函数指针的,所以在调用任何OpenGL的函数之前都需要初始化GLAD。

  if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))//给GLAD传入了用来加载系统相关的OpenGL函数指针地址的函数
    {
        std::cout << "failed to intialize GLAD" << std::endl;
        return nullptr;
    }

 

设置视口的大小,处理过的OpenGL坐标范围只为-1到1,因此我们事实上将(-1到1)范围内的坐标映射到(0, 800)和(0, 600)

glViewport(0, 0, 800, 600);

glViewport函数前两个参数控制窗口左下角的位置。第三个和第四个参数控制渲染窗口的宽度和高度(像素)。

当用户改变窗口的大小的时候,视口也应该被调整。我们可以对窗口注册一个回调函数(Callback Function),它会在每次窗口大小被调整的时候被调用:

//改变窗口大小
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    glViewport(0, 0, width, height);
}

还需要注册这个函数,告诉GLFW每当窗口调整大小的时候调用这个函数:

glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);//注册为调整窗口回调函数

当窗口被第一次显示的时候framebuffer_size_callback也会被调用。

 

现在可以开始绘制图像啦,程序中我们使用while渲染循环,因为我们不想绘制一次就退出程序,而是在关闭程序前一直绘制,如下

  while (!glfwWindowShouldClose(window))
    {
        processInput(window);

        //render
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        glfwSwapBuffers(window);//交换颜色缓冲(它是一个储存着GLFW窗口每一个像素颜色值的大缓冲)
        glfwPollEvents();//检查有没有触发什么事件
    }
  • glfwWindowShouldClose函数在我们每次循环的开始前检查一次GLFW是否被要求退出。
  • glClearColor来设置清空屏幕所用的颜色
  • glClear函数清空屏幕的颜色缓冲,它接受一个缓冲位(Buffer Bit)来指定要清空的缓冲,可能的缓冲位有GL_COLOR_BUFFER_BITGL_DEPTH_BUFFER_BITGL_STENCIL_BUFFER_BIT。这里只关心颜色值,所以只清空颜色缓冲。
  • glfwPollEvents函数检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,并调用对应的回调函数。
  • glfwSwapBuffers函数会交换颜色缓冲,它在这一迭代中被用来绘制,并且将会作为输出显示在屏幕上。
  • processInput窗口输入控制,用来实现一些输入控制
void processInput(GLFWwindow *window)
{
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)//点击ESC键退出绘制
        glfwSetWindowShouldClose(window, true);
}

 

最后退出绘制窗口时,要记得使用glfwTerminate函数释放资源

glfwTerminate();//释放/删除之前的分配的所有资源

 

好了,可以开始运行程序了,显示效果如图

所有代码

//GLAD的头文件包含了正确的OpenGL头文件(例如GL/gl.h),所以需要在其它依赖于OpenGL的头文件之前包含GLAD
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>

//改变窗口大小
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)//点击ESC键退出绘制
        glfwSetWindowShouldClose(window, true);
}

GLFWwindow* init_window()
{
    ///窗口初始化
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//主版本号,当API以不兼容的方式更改时,该值会增加。
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//次版本号,当特性被添加到API中时,它会增加,但是它保持向后兼容。
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//使用核心模式,不兼容已废弃函数

    //创建glfw窗口
    GLFWwindow* window = glfwCreateWindow(800, 600, "ping-window", NULL, NULL);
    if (window == NULL)
    {
        std::cout << "failed to create GLFW window" << std::endl;
        glfwTerminate();//释放/删除之前的分配的所有资源
        return nullptr;
    }
    glfwMakeContextCurrent(window);//将窗口的上下文设置为当前线程的主上下文
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);//注册为调整窗口回调函数

    //GLAD是用来管理OpenGL的函数指针的,在调用任何OpenGL的函数之前初始化GLAD
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))//给GLAD传入了用来加载系统相关的OpenGL函数指针地址的函数
    {
        std::cout << "failed to intialize GLAD" << std::endl;
        return nullptr;
    }

    glViewport(0, 0, 800, 600);//处理过的OpenGL坐标范围只为-1到1,因此我们事实上将(-1到1)范围内的坐标映射到(0, 800)和(0, 600)

    return window;
}


int hello_window()
{
    GLFWwindow* window = init_window();

    while (!glfwWindowShouldClose(window))
    {
        processInput(window);

        //render
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        glfwSwapBuffers(window);//交换颜色缓冲(它是一个储存着GLFW窗口每一个像素颜色值的大缓冲)
        glfwPollEvents();//检查有没有触发什么事件
    }

    std::cout << "finish!" << std::endl;
    glfwTerminate();//释放/删除之前的分配的所有资源
    return 0;
}


int main()
{
    hello_window();

    return 0;
}

 

标签:窗口,入门,OpenGL,GLFWwindow,window,GLFW,函数
From: https://www.cnblogs.com/ping-code/p/17607866.html

相关文章

  • 恋爱入门教学题解
    已知长度为\(n\)的三个两个实数序列\(A,B,X\),定义\(n\)个定义域为\(\R\)的函数\(f_1,f_2,\cdots,f_n\)。其中:\[f_k(x)=\sum_{i=1}^k|a_i(x-x_i)+b_i|\]现在,对于每一个\(k=1,2,\cdots,n\),求\(f_k\)的最小值。可以证明,最小值一定存在。\(n\le......
  • OpenGL入门——配置环境
    OpenGL有意将建一个上下文(Context)和一个用于显示的窗口的操作抽象出去,所以我们就得自己处理创建窗口,定义OpenGL上下文以及处理用户输入。有一些特别针对OpenGL创建窗口和上下文用来渲染的库,比如GLUT,SDL,SFML和GLFW。这里先选择使用跟主页-LearnOpenGLCN(learnopengl-cn.git......
  • OpenGL之绘制矩形使用索引和glUniform4f
    glUniform更改一个uniform变量或数组的值。要更改的uniform变量的位置由location指定,location的值应该由glGetUniformLocation函数返回。通过调用glUseProgram,glUniform操作的程序对象将成为当前状态的一部分。glUniform{1|2|3|4}{f|i}使用传进来的实参,修改通过location指定的uni......
  • 动力节点|MyBatis从入门实战到深入源码
    MyBatis是一种简单易用、灵活性高且高性能的持久化框架,也是Java开发中不可或缺的一部分。动力节点老杜的MyBatis教程,上线后广受好评从零基础小白学习的角度出发,层层递进从简单到深入,从实战到源码一步一案例,一码一实操,嘴对嘴指导MyBatis重点、难点、考点一网打尽不管你是小白还是正......
  • OpenGL之绘制三角形使用顶点颜色
     ●VBO、VAO与EBO之间的联系与区别:⭐️⭐️  ①顶点缓冲对象VBO是在显卡存储空间中开辟出的一块内存缓存区,用于存储顶点的各类属性信息,如顶点坐标、顶点法向量、顶点颜色数据等。在渲染时,可以直接从VBO中取出顶点的各类属性数据,由于VBO在显存而不是在内存中,不需要从CP......
  • 【数据结构 | 入门】堆栈与队列(问题引入&实现&算法优化)
    ......
  • Activiti7从入门到精通深入学习路线图?
    Activiti7从入门到精通深入学习路线图? 如果你想深入学习Activiti7并逐步精通,以下是一个可以供你参考的学习路线图:1.了解BPMN(BusinessProcessModelandNotation)和工作流引擎基础知识:-学习BPMN的基本概念、符号和语法。-理解Activiti7是一个开源的工作流引擎,可以......
  • 初识QT、窗口以及信号槽
    1基本规范:无论是写什么样的代码,第一步都应该是创建一个程序对象#include<QApplication>intmain(intargc,char*argv[]){QApplicationa(argc,argv);//创建对象并调用构造函数returna.exec();//因为是gui界面开发,那么程序的生存周期应该是一直存在的}2d......
  • 计算机视觉研究院出品:深度学习入门基础全库(附链接下载)
    关注并星标从此不迷路计算机视觉研究院计算机视觉研究院专栏作者:Edison_G今天我们“计算机视觉研究院”主要分享深度学习入门的基础书籍集合!主要由来自不同城市的同学一起努力的成果,希望可以给到新入门或即将入门的同学一些帮助,一起学习,共同进步!背景目标检测是数字图像中某一类(......
  • Docker入门
    Docker安装自动安装使用官方脚本自动安装curl-fsSLhttps://get.docker.com|bash-sdocker--mirrorAliyun手动安装卸载旧版本$sudoyumremovedocker\         docker-client\         docker-client-latest\   ......