简单的opengl步骤模板
以下内容整理自:https://learnopengl-cn.github.io/01%20Getting%20started/03%20Hello%20Window/
一.初始化 glfw 并设置相关参数:
glfwInit();//使用glfw前必须用glgwInit函数来初始化glfw
//用glfwWindowHint函数来配置glfw
//我们需要告诉GLFW我们要使用的OpenGL版本是3.3
//将主版本号(Major)和次版本号(Minor)都设为3
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, );//选择主版本号
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, );//选择次版本号
//我们同样明确告诉GLFW我们使用的是核心模式(Core - profile)
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
//如果使用的是Mac OS X系统则需要将注释的这句加上才能使这些设置生效
二.通过 glfwCreateWindow 函数创建窗口:
//接下来我们创建一个窗口对象,这个窗口对象存放了所有和窗口相关的数据,
//而且会被GLFW的其他函数频繁地用到
GLFWwindow *window = glfwCreateWindow(, , "LearnOpengl", NULL, NULL);
//创建窗口,前两个参数为窗口的宽和搞,第三个参数表示窗口的标题,后两个参数暂时不讨论
if (window == NULL) {
std::cout << "failed to create glfw window" << std::endl;
glfwTerminate();//释放之前分配的资源
return -;
}
//创建完窗口通知GLFW将窗口的上下文设置为当前线程的主上下文
glfwMakeContextCurrent(window);
三.初始化 glad:
//GLAD是用来管理OpenGL的函数指针的,所以在调用任何OpenGL的函数之前
//我们需要初始化GLAD
//我们给GLAD传入了用来加载系统相关的OpenGL函数指针地址的函数。GLFW给
//我们的是glfwGetProcAddress,它根据我们编译的系统定义了正确的函数
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
std::cout << "failed to initialize glad" << std::endl;
return -;
}
四.创建视口:
//视口
//在我们开始渲染之前还有一件重要的事情要做,我们必须告诉OpenGL渲染窗口的尺寸大小,
//即视口(Viewport),这样OpenGL才只能知道怎样根据窗口大小显示数据和坐标。
//我们可以通过调用glViewport函数来设置窗口的维度
glViewport(, , , );//前两个参数控制左下角的位置,后两个参数控制渲染窗口的宽度和高度(像素)
//注意和前面的GLFWwindow区别开来,GLFWwindow定义的是GLFW的维度
//我们实际上也可以将视口的维度设置为比GLFW的维度小,这样子之后所有的OpenGL渲染将会在一个更小
//的窗口中显示,这样子的话我们也可以将一些其它元素显示在OpenGL视口之外
注意区分创建 glfw 窗口和视口的区别
五.接下来在渲染循环之前我们可以注册我们需要的回掉函数:
//我们还需要注册回掉函数,告诉GLFW我们希望每当窗口调整大小的时候调用这个函数
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
//当窗口被第一次显示的时候framebuffer_size_callback也会被调用。对于视网膜(Retina)显示屏,width和height都会明显比原输入值更高一点
//我们还可以将我们的函数注册到其它很多的回调函数中。比如说,我们可以创建一个回调函数来处理手柄输入变化,处理错误消息等。我们会在创建窗口之后,
//渲染循环初始化之前注册这些回调函数
六.渲染循环:
//渲染循环,让glfw退出前一直保持运动
//glfwWindowShouldClose函数在我们每次循环的开始前检查一次GLFW是否被要求退出,如果是的话该函数返回true然后渲染循环便结束了,之后为我们就可以关闭应用程序了
while (!glfwWindowShouldClose(window)) {
processInput(window); //清除颜色缓冲之后,整个颜色缓冲都会被填充为glClearColor里所设置的颜色
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
//glClear函数清空屏幕的颜色缓冲
glClear(GL_COLOR_BUFFER_BIT); //glfwSwapBuffers函数会交换颜色缓冲(它是一个储存着GLFW窗口每一个像素颜色值的大缓冲),
//它在这一迭代中被用来绘制,并且将会作为输出显示在屏幕上。否则只会显示一片空白
glfwSwapBuffers(window);
//glfwPollEvents函数检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,并调用对应的回调函数(可以通过回调方法手动设置)
glfwPollEvents();
}
渲染循环的模板:
// 渲染循环
while(!glfwWindowShouldClose(window))
{
// 输入
processInput(window); // 渲染指令
... // 检查并调用事件,交换缓冲
glfwPollEvents();
glfwSwapBuffers(window);
}
七.释放资源:
//当渲染循环结束后我们需要正确释放/删除之前的分配的所有资源
glfwTerminate();
完整代码:
// hello_window.cpp: 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream> //当用户改变窗口的大小的时候,视口也应该被调整。我们可以对窗口注册一个回调函数(Callback Function),
//它会在每次窗口大小被调整的时候被调用
void framebuffer_size_callback(GLFWwindow *window, int width, int heigh) {
glViewport(, , width, heigh);
} //使用GLFW的glfwGetKey函数,它需要一个窗口以及一个按键作为输入。这个函数将会返回这个按键是否正在被按下
void processInput(GLFWwindow *window) {
//这里我们检查用户是否按下了返回键(Esc)(如果没有按下,glfwGetKey将会返回GLFW_RELEASE。
//如果用户的确按下了返回键,我们将通过glfwSetwindowShouldClose使用把WindowShouldClose属性设置为 true的方法关闭GLFW
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
glfwSetWindowShouldClose(window, true);
}
} int main()
{
glfwInit();//使用glfw前必须用glgwInit函数来初始化glfw
//用glfwWindowHint函数来配置glfw
//我们需要告诉GLFW我们要使用的OpenGL版本是3.3
//将主版本号(Major)和次版本号(Minor)都设为3
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, );//选择主版本号
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, );//选择次版本号
//我们同样明确告诉GLFW我们使用的是核心模式(Core - profile)
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
//如果使用的是Mac OS X系统则需要将注释的这句加上才能使这些设置生效 //接下来我们创建一个窗口对象,这个窗口对象存放了所有和窗口相关的数据,
//而且会被GLFW的其他函数频繁地用到
GLFWwindow *window = glfwCreateWindow(, , "LearnOpengl", NULL, NULL);
//创建窗口,前两个参数为窗口的宽和搞,第三个参数表示窗口的标题,后两个参数暂时不讨论
if (window == NULL) {
std::cout << "failed to create glfw window" << std::endl;
glfwTerminate();//释放之前分配的资源
return -;
}
//创建完窗口通知GLFW将窗口的上下文设置为当前线程的主上下文
glfwMakeContextCurrent(window); //GLAD是用来管理OpenGL的函数指针的,所以在调用任何OpenGL的函数之前
//我们需要初始化GLAD
//我们给GLAD传入了用来加载系统相关的OpenGL函数指针地址的函数。GLFW给
//我们的是glfwGetProcAddress,它根据我们编译的系统定义了正确的函数
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
std::cout << "failed to initialize glad" << std::endl;
return -;
} //视口
//在我们开始渲染之前还有一件重要的事情要做,我们必须告诉OpenGL渲染窗口的尺寸大小,
//即视口(Viewport),这样OpenGL才只能知道怎样根据窗口大小显示数据和坐标。
//我们可以通过调用glViewport函数来设置窗口的维度
glViewport(, , , );//前两个参数控制左下角的位置,后两个参数控制渲染窗口的宽度和高度(像素)
//注意和前面的GLFWwindow区别开来,GLFWwindow定义的是GLFW的维度
//我们实际上也可以将视口的维度设置为比GLFW的维度小,这样子之后所有的OpenGL渲染将会在一个更小
//的窗口中显示,这样子的话我们也可以将一些其它元素显示在OpenGL视口之外 //我们还需要注册回掉函数,告诉GLFW我们希望每当窗口调整大小的时候调用这个函数
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
//当窗口被第一次显示的时候framebuffer_size_callback也会被调用。对于视网膜(Retina)显示屏,width和height都会明显比原输入值更高一点
//我们还可以将我们的函数注册到其它很多的回调函数中。比如说,我们可以创建一个回调函数来处理手柄输入变化,处理错误消息等。我们会在创建窗口之后,
//渲染循环初始化之前注册这些回调函数 //渲染循环,让glfw退出前一直保持运动
//glfwWindowShouldClose函数在我们每次循环的开始前检查一次GLFW是否被要求退出,如果是的话该函数返回true然后渲染循环便结束了,之后为我们就可以关闭应用程序了
while (!glfwWindowShouldClose(window)) {
processInput(window); //清除颜色缓冲之后,整个颜色缓冲都会被填充为glClearColor里所设置的颜色
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
//glClear函数清空屏幕的颜色缓冲
glClear(GL_COLOR_BUFFER_BIT); //glfwSwapBuffers函数会交换颜色缓冲(它是一个储存着GLFW窗口每一个像素颜色值的大缓冲),
//它在这一迭代中被用来绘制,并且将会作为输出显示在屏幕上。否则只会显示一片空白
glfwSwapBuffers(window);
//glfwPollEvents函数检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,并调用对应的回调函数(可以通过回调方法手动设置)
glfwPollEvents();
} //当渲染循环结束后我们需要正确释放/删除之前的分配的所有资源
glfwTerminate(); return ;
}
简单的opengl步骤模板的更多相关文章
- Unity中简单使用Opengl
简介 由于项目特殊需求,需要在unity中使用一些OpenGL的东西来绘制图形(PS:其实就是有一个拖尾算法只有OpenGL版本~~~懒得改了,直接在unity中使用OpenGL算了).所以琢磨咯下如 ...
- 简单的Verilog测试模板结构
这里记录一下曾经用到的简单的测试模板,如下所示: //timescale `timescale 1ns/1ns module tb_module(); //the Internal motivatio ...
- CodeFirst简单演示的步骤
CodeFirst简单演示的步骤 创建实体类[Student] public class Student { public long Id { get; set; } public string Na ...
- 简单的html渲染模板引擎
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 简单实现C++Stack模板
栈的特点是先进后出以及只能在栈顶进行插入和删除操作 本次实现的栈的基本操作: 1)弹栈 2)压栈 3)求栈大小 4)求栈容量 5)判断栈空 6)获取栈顶元素 1.用数组的方式实现栈基本操作 /** * ...
- 简单理解OpenGL模型视图变换
前几天学习了OpenGL的绘图原理(其实就是坐标的不停变换变换),看到网上有个比较好的例程,于是学习了下,并在自己感兴趣的部分做了注释. 首先通过glMatrixMode(GL_MODELVIEW)设 ...
- 一个LaTeX 中文文档的简单而实用的模板
网上找的一个latex中文模板,感觉很简单,在我机器上有点小问题,完善记录一下. %要运行该模板,LaTex需要安装CJK库以支持汉字. %字体大小为12像素,文档类型为article %如果你要写论 ...
- 线段树:CDOJ1591-An easy problem A (RMQ算法和最简单的线段树模板)
An easy problem A Time Limit: 1000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Pr ...
- 超简单的OpenGL & WebGL & Three.js介绍_1
专业解释 什么是OpenGL OpenGL(Open Graphics Library即开放图形库或者“开放式图形库”)是用于渲染2D.3D矢量图形的跨语言.跨平台的应用程序编程接口(API). 这个 ...
随机推荐
- 密码生成工具Cupp
Cupp可根据已知信息生成相应的字典,用来爆破很有帮助 首先先安装一下cupp 命令:apt-get install cupp 参数说明: -v查看cupp版本号 -h 查看参数列表 -l 从gith ...
- vs2010一运行就报错deven.exe assert failure 解决方法,卸载系统中.netFramework最新版本的(简体中文)
vs2010一运行就报错deven.exe assert failure 解决方法,卸载系统中.netFramework最新版本的(简体中文)
- http协议Keep-Alive
Keep-Alive 是什么? 概观 默认情况下,HTTP链接通常在请求完成之后关闭.这意味着服务端在完成响应的交付之后便关闭了TCP链接.为了让链接保持打开,来满足多请求,可以使用keep-aliv ...
- 让你的javascript代码高大上
1,创造简短的写法 你可以这么写: var slice = Array.prototype.slice; slice.call(arguments); //转化成数组 也可以这么写:(ie9+) va ...
- Spring 快速入门
1.持久层 (1) 域模型层 (2) Dao 持久层接口 (3) DaoImpl 持久层接口实现 2.业务层 Service 业务接口层 ServiceImpl 业务接口实现 3.展现层 Sp ...
- Java虚拟机(三):垃圾收集器
一.串行(Serial)收集器 最古老,最稳定 效率高 可能会产生较长的停顿 -XX:+UseSerialGC 新生代.老年代使用串行回收 新生代复制算法 老年代标记-压缩 二.并行收集器 1. Pa ...
- Windows:condition_variable 两个例子
题目:子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码.注意:一定是子线程先执行,主线程再执行. #in ...
- 使用laravel实现用户的登陆
首先在 php artisan 里面 make:auth 生产一个门脸类 修改配置文件里面要哪个模型登陆 模型得继承一下才能 先写一下注册 密码必须要使用laravel的加密方法,使用MD5都没用 l ...
- Linux文件系统操作命令
Linux文件系统操作命令 文件系统操作命令: 1. cat:可以显示文件的内容(经常和more搭配使用),或将多个文件合并成一个文件. 2. chgrp:用来改变文件或目录所属的用户组,命令的参数以 ...
- Django--form基础
一.Django--form功能 用户提交数据验证 生成html标签 二.基础实例 需求 利用Django的form功能,接收用户注册信息. urls.py 1 2 3 4 5 from app01 ...