首页 > 其他分享 >1.1 HELLO 窗口

1.1 HELLO 窗口

时间:2023-07-25 14:23:46浏览次数:44  
标签:窗口 1.1 渲染 OpenGL window GLFW include HELLO

跟着教程,开始第一步创建窗口吧!这一节不涉及太多知识。
本节会出现一些名词,我们现在只需要知道它们大概是干什么的就行。
● GLFW:一个专门针对OpenGL的C语言库,通过它提供的接口,我们就可以渲染物体了;
● GLAD:用来管理OpenGL函数指针的库,在调用所有OpenGL函数之前,我们要初始GLAD;
● 视口(Viewport):渲染窗口是我们渲染物体的地方,就像一个“画布”,而视口就是这个“画布”的尺寸。在开始渲染(“画”)物体之前,总要规定视口(“画布”)大小的,对吧?

一个比较完整的流程(的伪代码)就像是这样:

#include <各种你需要的库>

int main(){
    // 初始化GLFW, 实例化GLFW窗口, 设置一些窗口对象的基本属性
    // ..........

    // 还记得吗,在调用所有OpenGL函数之前,我们要初始GLAD
    // ..........

    // 渲染之前,还要设置视口
    // ..........

    // 准备工作做完了!开始渲染循环(Rending Loop)
    while (当前的window还没关闭){
        // 输入控制
        // ........

        // 各种各样的渲染的指令
        // ........

        // 检查并调用事件,交换缓冲(见双缓冲, Double Buffer)
        // ........
    }
    
    // 渲染完了,释放已经不需要的资源
    // ..........

    return 0;
}

嗯……很成功!这是源代码:

/*
Hello 窗口=v=
*/
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <bits/stdc++.h>
using namespace std;

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

int main(void) {
    // 实例化GLFW窗口, 选项的详细含义可以参见 https://www.glfw.org/docs/latest/window.html#window_hints
    glfwInit();// 初始化GLFW
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    // 创建窗口对象, 存放所有和窗口相关的数据
    GLFWwindow * window = glfwCreateWindow(800, 600, "startMagic...", NULL, NULL);
    if (NULL == window) {
        cout << "Failed to create GLFW window" << endl;
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window); // 将窗口的上下文设置为当前线程的主上下文

    // GLAD是用来管理OpenGL的函数指针的, 所以在调用任何OpenGL的函数之前我们要初始化GLAD
    // 我们给GLAD传入了用来加载系统相关的OpenGL函数指针地址的函数
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
        cout << "Failed to initialize GLAD" << endl;
        return -1;
    }
    // 设置渲染窗口的尺寸大小, 即视口(Viewport)
    glViewport(0, 0, 800, 600); // 窗口左下角位置, 渲染窗口的宽/高
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

    // 渲染循环(Render Loop), 能在我们让GLFW退出前一直保持运行
    while (!glfwWindowShouldClose(window)) {
        // 输入
        processInput(window);
        // 渲染指令
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f); // 状态设置函数
        glClear(GL_COLOR_BUFFER_BIT); // 状态使用函数
        // 检查并调用事件, 交换缓冲
        glfwSwapBuffers(window); // 交换颜色缓冲
        glfwPollEvents(); // 检查有没有触发什么事件, 并调用对应的回调函数
    }
    glfwTerminate();

    return 0;
}

// 回调函数(Callback Function)会在每次窗口大小被调整时被调用, 当窗口大小改变时同时改变视口大小
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);
    }
}

生成了一个蓝绿色窗口,并且按esc键可以退出。

下面开始hello三角形!

标签:窗口,1.1,渲染,OpenGL,window,GLFW,include,HELLO
From: https://www.cnblogs.com/vivaldi370/p/Graphics_1_1.html

相关文章

  • iTunes v12.1.1 正式版
    下载:https://secure-appldnld.apple.com/itunes12/031-17457.20150218.FFCRg/iTunesSetup.exehttps://secure-appldnld.apple.com/itunes12/031-17459.20150217.m60rr/itunes6464setup.exe......
  • 还原窗口 取消最小化
    #include<Windows.h>intmain(){//获取目标窗口的句柄HWNDhWnd=FindWindow(nullptr,L"1111111");if(hWnd!=nullptr){//将窗口还原(取消最小化)ShowWindow(hWnd,SW_RESTORE);//激活窗口并将其带到前台SetForegr......
  • 【go语言】1.1.1 Go 语言的历史和背景
    Go语言,也被称为Golang,是一种静态强类型、编译型的开源编程语言。Go语言的出现是为了解决当下的软件开发问题,特别是大规模软件系统的开发。Go语言的设计者包括RobertGriesemer、RobPike和KenThompson,他们都是在Google工作的资深工程师。他们发现当时的编程语言,无论是......
  • android开发 - Widgets窗口小部件
    Widgets指的窗口小部件 自定义一个Widgets做时间的窗口小部件一个widget是一个广播接受者,需要在清单中注册第一,有一个widgetpublicclassMainWidgetextendsAppWidgetProvider{@OverridepublicvoidonUpdate(Contextcontext,AppWidgetManagerappWidgetManager,i......
  • GlassFish 3.1.1 的JMS 独立客户端编程
    下面文章很长,至于我的最终解决方法是在独立客户端的项目上右键->库->添加JAR/Folder加入C:\ProgramFiles\glassfish-3.1.2\glassfish\lib\gf-client.jar文件最近一直在关注JMS,起因是从Magento的PHP系统向JMS发送消息。实验了ActiveMQ,GlassFish与ActiveMQ的集成。最后还是......
  • Node.js入门 - 永恒的Hello World!
    文章原作者为LeeJacobson,已经作者授权翻译用于非商业用途。介绍 这是我的关于Node.js系列入门教程的第一篇。必须说明一下,我并不是Node.js的专家,但是尝试向别人解释这是怎么回事是自我学习的一个好方法。如果你发现有些地方并不是那么正确,请提出来让我知道以便修正,谢之。 最近......
  • 1.1 计算机的发展
    硬件:计算机的实体,如主机、外设等软件:由具有各类特殊功能的程序组成软件系统:如:操作系统、数据库管理系统(DBMS)、标准程序库、网络软件、语言处理程序、服务程序应用软件:如:抖音、王者荣耀、迅雷、美图秀秀...第一代电子数字计算机:ENIAC(1946)软件的发展:......
  • Ruby实践—HelloWorld
    开发环境OS:WindowsXPRuby:Ruby1.9.1Rails:Rails2.3.5IDE:RubyMine2.0.1 1、创建Rails工程 2、修改/config/database.yml自动创建的工程中默认数据库连接的是sqlite,如果没有安装此数据库,需要修改该配置(本例中使用的是mysql)#MysqlVersion5.1.46development:adapter:mys......
  • [爬虫]1.1.3 网络爬虫的应用场景
    网络爬虫在各种不同的领域都有广泛的应用。它们可以用来收集,分析,处理和理解大量的在线信息。以下是网络爬虫的一些主要应用场景:1.搜索引擎搜索引擎,如Google,Bing,和Baidu,是网络爬虫的最主要的应用场景。搜索引擎使用网络爬虫来抓取网页内容,然后对这些内容进行索引并存储在数据库......
  • 云之道知识付费v2 3.1.1独立版小程序源码+教程
    我已经对源码中的所有引流部分进行了修改,如果还有任何未被删除的部分,请麻烦您留言告诉我!请注意,本源码仅供学习使用,请在下载后的24小时内将其删除。因此,目前我了解的情况是,它不支持通过观看广告来获取资源。如果有大佬在搭建后发现它支持该功能,请务必告诉我操作步骤!我在此向你们表......