1.1 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 HELLO 窗口的更多相关文章
- .NET Core的日志[3]:将日志写入Debug窗口
定义在NuGet包"Microsoft.Extensions.Logging.Debug"中的DebugLogger会直接调用Debug的WriteLine方法来写入分发给它的日志 ...
- JS判断鼠标进入容器方向的方法和分析window.open新窗口被拦截的问题
1.鼠标进入容器方向的判定 判断鼠标从哪个方向进入元素容器是一个经常碰到的问题,如何来判断呢?首先想到的是:获取鼠标的位置,然后经过一大堆的if..else逻辑来确定.这样的做法比较繁琐,下面介绍两种 ...
- Windows API 设置窗口下控件Enable属性
参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-put.html http://www.yuanjiaocheng.net/we ...
- cesium自定义气泡窗口infoWindow
一.自定义气泡窗口与cesium默认窗口效果对比: 1.cesium点击弹出气泡窗口显示的位置固定在地图的右上角,默认效果: 2.对于习惯arcgis或者openlayer气泡窗口样式的giser来说 ...
- 如何dos命令打开服务窗口?
1.输入services.msc点击<确定>进入服务窗口.如图:
- cmd窗口编码设置
问题描述:不知道误操作了什么,导致cmd窗口的鼠标显示位置出现错位,如下: 现在要将鼠标位置调整回来. 使用工具:cmd. 操作步骤: 1.查看cmd属性可以看到 可以看到是UTF-8编码格式的,我们 ...
- 从淘宝 UWP 的新功能 -- 比较页面来谈谈 UWP 的窗口多开功能
前言 之前在 剁手党也有春天 -- 淘宝 UWP ”比较“功能诞生记 这篇随笔中介绍了一下 UWP 淘宝的“比较”新功能呱呱坠地的过程.在鲜活的文字背后,其实都是程序员不眠不休的血泪史(有血有泪有史) ...
- 2000条你应知的WPF小姿势 基础篇<74-77 WPF 多窗口Tips>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
- [MFC] MFC 查找其他窗口句柄 操作其他窗口
请直接查找CWnd类!!! CWnd* cWnd; cWnd= cWnd->FindWindowW(L"kwmusicmaindlg",NULL); CRect cRect; ...
- 【WPF】运用MEF实现窗口的动态扩展
若干年前,老周写了几篇有关MEF的烂文,简单地说,MEF是一种动态扩展技术,比如可以指定以某个程序集或某个目录为搜索范围,应用程序在运行时会自动搜索符合条件的类型,并自动完成导入,这样做的好处是,主程 ...
随机推荐
- WordPress基础之基本SEO设置
基础内容,不会涉及过深,在谷歌SEO教程中会做详细的介绍,我这里只简单讲下. 1. SEO介绍 SEO,又名搜索引擎优化(Search Engine Optimization,缩写为SEO)是透过了解 ...
- centos8配置网络环境及阿里云网络yum源
一.centos8配置网络环境 1.修改配置网卡配置文件 [root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens18 TYPE ...
- 【Zookeeper】Re02 CuratorAPI
Curator,提供给Java操作ZK的API组件: 需要的组件依赖: <!-- https://mvnrepository.com/artifact/org.apache.curator/cu ...
- 【Vue】03 Slot 插槽 & 自定义事件
顾名思义就是一个槽,可以嵌入各种各样的东西 Vue的插槽就是一个slot标签,可以在这个定义了插槽的组件中插入其他的组件 但是有一点很重要:使用插槽的组件必须要用div标签一个根标签包裹,否则无效 & ...
- 代码随想录Day4
24.两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点.你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换). 示例 1: 输入:head = [1, ...
- Ubuntu Server无桌面无显示器情况下虚拟屏幕xvfb的安装及设置—ubuntu18.04server服务器系统下为python安装虚拟显示器 (使用jupyter notebook在web端播放openai的gym下保存的运行视频——需安装ipython)
1. 安装xvfb sudo apt-get install xvfb Xvfb是流行的虚拟现实库,可以使很多需要图形界面的程序虚拟运行. 2. 安装pyvirtualdisplay pyvirtu ...
- 使用UltraISO克隆clone树莓派SD卡(注意不是复制、备份,是克隆)
搞了好长时间做了一个树莓派的SD卡,包括了一些自己安装的配置,为了防止哪天把这个SD卡搞坏掉(比如写数据时候断电,比如apt upgrade时掉电),于是考虑把这个SD卡进行克隆clone. 因为手上 ...
- NVIDIA公司的半成品项目cule——GPU端运行的Atari2600游戏环境——已经废弃的项目
官网介绍地址: https://developer.nvidia.com/blog/new-open-source-gpu-accelerated-atari-emulator-for-reinfor ...
- 基础数据结构->set&&map
set&&map BEGIN:惜墨如金 set用法 基本用法 #include<bits/stdc++.h> using namespace std; void the_s ...
- CH08_结构体
CH08_结构体 基本概念 结构体属于用户自定义数据类型,允许用户存储不同的数据类型. 定义和使用 语法:struct 结构体名{ 结构体成员列表} 通过结构体创建变量的方式有三种: struct 结 ...