跟着教程,开始第一步创建窗口吧!这一节不涉及太多知识。

本节会出现一些名词,我们现在只需要知道它们大概是干什么的就行。

● 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 HELLO 窗口的更多相关文章

  1. .NET Core的日志[3]:将日志写入Debug窗口

    定义在NuGet包"Microsoft.Extensions.Logging.Debug"中的DebugLogger会直接调用Debug的WriteLine方法来写入分发给它的日志 ...

  2. JS判断鼠标进入容器方向的方法和分析window.open新窗口被拦截的问题

    1.鼠标进入容器方向的判定 判断鼠标从哪个方向进入元素容器是一个经常碰到的问题,如何来判断呢?首先想到的是:获取鼠标的位置,然后经过一大堆的if..else逻辑来确定.这样的做法比较繁琐,下面介绍两种 ...

  3. Windows API 设置窗口下控件Enable属性

    参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-put.html http://www.yuanjiaocheng.net/we ...

  4. cesium自定义气泡窗口infoWindow

    一.自定义气泡窗口与cesium默认窗口效果对比: 1.cesium点击弹出气泡窗口显示的位置固定在地图的右上角,默认效果: 2.对于习惯arcgis或者openlayer气泡窗口样式的giser来说 ...

  5. 如何dos命令打开服务窗口?

    1.输入services.msc点击<确定>进入服务窗口.如图:

  6. cmd窗口编码设置

    问题描述:不知道误操作了什么,导致cmd窗口的鼠标显示位置出现错位,如下: 现在要将鼠标位置调整回来. 使用工具:cmd. 操作步骤: 1.查看cmd属性可以看到 可以看到是UTF-8编码格式的,我们 ...

  7. 从淘宝 UWP 的新功能 -- 比较页面来谈谈 UWP 的窗口多开功能

    前言 之前在 剁手党也有春天 -- 淘宝 UWP ”比较“功能诞生记 这篇随笔中介绍了一下 UWP 淘宝的“比较”新功能呱呱坠地的过程.在鲜活的文字背后,其实都是程序员不眠不休的血泪史(有血有泪有史) ...

  8. 2000条你应知的WPF小姿势 基础篇<74-77 WPF 多窗口Tips>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  9. [MFC] MFC 查找其他窗口句柄 操作其他窗口

    请直接查找CWnd类!!! CWnd* cWnd; cWnd= cWnd->FindWindowW(L"kwmusicmaindlg",NULL); CRect cRect; ...

  10. 【WPF】运用MEF实现窗口的动态扩展

    若干年前,老周写了几篇有关MEF的烂文,简单地说,MEF是一种动态扩展技术,比如可以指定以某个程序集或某个目录为搜索范围,应用程序在运行时会自动搜索符合条件的类型,并自动完成导入,这样做的好处是,主程 ...

随机推荐

  1. .NET周刊【7月第4期 2024-07-28】

    国内文章 .NET 高性能缓冲队列实现 BufferQueue https://mp.weixin.qq.com/s/fUhJpyPqwcmb3whuV3CDyg BufferQueue 是一个用 . ...

  2. 将txt转化为csv的方法和遇到问题

    一.无法修改扩展名步骤如下 二.转换之后所有数据都挤在第一列 win10系统修改文件扩展名只需4部,打开我的电脑->查看->选择->查看->取消勾选(已知隐藏文件的扩展名)-& ...

  3. 从C++看C#托管内存与非托管内存

    进程的内存 一个exe文件,在没有运行时,其磁盘存储空间格式为函数代码段+全局变量段.加载为内存后,其进程内存模式增加为函数代码段+全局变量段+函数调用栈+堆区.我们重点讨论堆区. 进程内存 函数代码 ...

  4. .NET 8 通用权限框架 前后端分离,开箱即用

    前言​ 推荐一个基于.NET 8 实现的通用权限开发框架Admin.NET,前端使用Vue3/Element-plus开发. 基于.NET 8(Furion)/SqlSugar实现的通用管理平台.整合 ...

  5. 【Lodop】01 Lodop手册阅读上手

    官方网站: http://www.c-lodop.com/index.html 版本:6.2.2.6 一.概述 Lodop是一款用于WEB打印开发的专业WEB打印控件 控件发布包有3个系统文件组成,主 ...

  6. 顶级围棋AI被发现漏洞:“超人类人工智能”还有很长的路?

    原文地址: https://www.bjnews.com.cn/detail/1720537986168936.html 参考资料: (1)Can AI be superhuman? Flaws in ...

  7. Streamlit运行出现ModuleNotFoundError: No module named ‘altair.vegalite.v4‘ —— ModuleNotFoundError: No module named 'altair.vegalite.v4'

    参考: https://blog.csdn.net/ikun_King/article/details/131852167 解决方法: pip install altair=4.2.2

  8. 关于python的GIL的解除——PEP 703 – Making the Global Interpreter Lock Optional in CPython

    PEP地址: https://peps.python.org/pep-0703/ PEP 703 – Making the Global Interpreter Lock Optional in CP ...

  9. 实验室服务彻底死机记录——硬件故障——主板pcie槽坏掉或显卡坏掉

    2022年11月8日   后记(最新更新) 服务器送售后,售后给厂家技术打电话,厂家技术说可能是显卡的电源线松了,于是我们打开机箱把显卡的电源线紧了紧,然后神奇的事情发生了,故障解除了...... 一 ...

  10. Odd and Even Zeroes 题解

    前言 题目链接:洛谷:UVA. 题目简述 定义 \(\operatorname{count}(num)\) 表示 \(num\) 末尾 \(0\) 的个数.给出 \(n\)(\(n \leq 10^{ ...