openGL 学习笔记 (一) 了解 OpenGL,创建第一个OpenGL窗口
// 序章
最开始我以为OpenGL是一系列的API,他给出了一系列对计算机图像的操作接口。
但其实OpenGL其实并不是一个API,他是由khronos组织制定并维护的规范。
早期的OpenGL使用立即渲染模式(固定渲染管线),后期使用核心渲染模式。 -- TODO 以后要深入了解两种渲染方式的区别。
OpenGL自身其实是一个巨大的状态机:使用一系列变量来改变OpenGL的状态。从而改变OpenGl的绘制方式。我们使用OpenGL状态设置函数去改变OpenGL的上下文(既状态);使用状态使用函数,根据当前的OpenGl状态执行一些操作。
OpenGL内核是用C写的,因为C的一些语言结构不易被翻译到其他高级语言,所以在开发时引入了一些抽象层如对象(Object)。
在OpenGL中对象是被作用于一些状态的集合,他代表GL状态的一个子集,其实就可以把OpenGL的状态看做是一个巨大的结构体:
1 struct OpenGl_Context {
2 ...
3 float stat_1
4 int stat_2
5 char[] stat_3
6 object* object_Window_Target;
7 ...
8 }
// 创建窗口
需要 GLFW GLAD
配置 GLFW 的链接库,文件包含, LINK链接器
配置 GLAD 的文件包含,将glad.c 加入到项目中去
VS环境下需要有main函数编译才能完全成功。
GLAD: 用来管理OpenGL的函数指针,在调用任何OpenGL的函数之前需要初始化GLAD,他会根据不同的编译系统返回可使用的正确的函数。
双缓冲:应用程序使用单缓冲绘图时可能会存在图像闪烁的问题。因为单缓冲状态下图像不是一下子就绘制出来的,是按照从左到右,从上到下一步步绘制而成。为了解决这个问题一般会使用双缓冲绘制方式解决问题,前缓冲区保存着最终输出的成像,并在屏幕上显示,所有的渲染指令都会在后缓冲上绘制,在所有渲染指令执行完毕后,交换(swap)前后缓冲,图像就可以立即显示出来。
1 #include <iostream>
2 #include <glad/glad.h>
3 #include <GLFW/glfw3.h>
4 #include <Windows.h>
5 #include <ctime>
6
7 using namespace std;
8
9 const unsigned int SCR_WIDTH = 800;
10 const unsigned int SCR_HEIGHT = 600;
11
12 void framebuffer_size_callback(GLFWwindow* windos, int width, int height)
13 {
14 glViewport(0, 0, width, height);
15 }
16
17 void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
18 {
19 if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
20 {
21 glfwSetWindowShouldClose(window, GL_TRUE);
22 }
23 else if (key == GLFW_KEY_C && action == GLFW_PRESS)
24 {
25 srand(time(0));
26 float r = ((rand() % 10) + 1) / 10.0f;
27 float g = ((rand() % 10) + 1) / 10.0f;
28 float b = ((rand() % 10) + 1) / 10.0f;
29 glClearColor(r, g, b, 1.0f);
30 glClear(GL_COLOR_BUFFER_BIT);
31 glfwSwapBuffers(window);
32 }
33 }
34
35 int main()
36 {
37 //初始化GLFW
38 glfwInit();
39
40 //设置OpenGL版本号为3.3
41 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
42 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
43
44 //设置OpenGL渲染方式为核心渲染
45 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
46
47 // 创建一个宽800,高600,的窗口,窗口名字为"myGLWindow".
48 GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "myGLWindow", NULL, NULL);
49 if (window == NULL)
50 {
51 std::cout << "Failed to create GLFW window" << std::endl;
52 glfwTerminate(); // 销毁窗口和资源
53 return -1;
54 }
55
56 // 设置该窗口为GLFW的主当前线程的主上下文
57 glfwMakeContextCurrent(window);
58
59 //初始化GLAD, 其实是用加载系统相关的OpenGL函数指针地址的函数的返回值判断GLAD是否初始化成功
60 if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
61 {
62 std::cout << "Failed to initialize GLAD" << std::endl;
63 return -1;
64 }
65
66 // 获取窗口windows的宽高
67 int width, height;
68 glfwGetFramebufferSize(window, &width, &height);
69
70
71 // 设置OpenGL渲染窗口的尺寸大小, 前两个参数控制左下角原点的位置
72 glViewport(0, 0, width, height);
73
74 // 注册窗口大小改变的回调
75 glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
76
77 //添加键盘输入回调
78 glfwSetKeyCallback(window, key_callback);
79
80 // 循环渲染
81 while (!glfwWindowShouldClose(window))
82 {
83 //glClearColor(0.2f, 0.3f, 0.5f, 1.0f);
84 //glClear(GL_COLOR_BUFFER_BIT);
85 //glfwSwapBuffers(window); // 交换窗口颜色缓冲
86
87 glfwPollEvents(); // 检查事件触发,更新窗口状态,调用已经注册的回调函数
88 }
89
90 glfwTerminate();
91
92 return 0;
93 }
openGL 学习笔记 (一) 了解 OpenGL,创建第一个OpenGL窗口的更多相关文章
- OpenGL学习-------visual studio 2010配置和第一个OpenGL程序讲解
OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性. 1.与C语言紧密结合. OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenG ...
- MyBatis学习笔记(一)创建第一个MyBatis项目
一.新建Maven项目 http://www.mybatis.org/mybatis-3/zh/index.html 该链接为MyBatis官方地址 创建MyBatis项目主要有两种办法,一种是导入j ...
- 【学习笔记】python 简单创建新建一个网络客户端,并返回相关的信息
#导入socket包 import socket #使用socket.socket创建socket连接 #AF_INET表示通信类型,与IPv4对应 #SOCK_STREAM对应TCP通信 print ...
- django学习笔记【002】创建第一个django app
2.3.3 1.创建一个名叫polls的app python3. manage.py startapp polls tree mysite/ mysite/ ├── db.sqlite3 ├── ma ...
- OpenGL学习笔记:拾取与选择
转自:OpenGL学习笔记:拾取与选择 在开发OpenGL程序时,一个重要的问题就是互动,假设一个场景里面有很多元素,当用鼠标点击不同元素时,期待作出不同的反应,那么在OpenGL里面,是怎么知道我当 ...
- opengl学习笔记(二):使用OpenCV来创建OpenGL窗口
通常的增强现实应用需要支持OpenGL的OpenCV来对真实场景进行渲染.从2.4.2版本开始,OpenCV在可视化窗口中支持OpenGL.这意味着在OpenCV中可轻松渲染任何3D内容. 若要在Op ...
- OpenGL学习笔记3——缓冲区对象
在GL中特别提出了缓冲区对象这一概念,是针对提高绘图效率的一个手段.由于GL的架构是基于客户——服务器模型建立的,因此默认所有的绘图数据均是存储在本地客户端,通过GL内核渲染处理以后再将数据发往GPU ...
- V-rep学习笔记:机器人模型创建3—搭建动力学模型
接着之前写的V-rep学习笔记:机器人模型创建2—添加关节继续机器人创建流程.如果已经添加好关节,那么就可以进入流程的最后一步:搭建层次结构模型和模型定义(build the model hierar ...
- V-rep学习笔记:机器人模型创建2—添加关节
下面接着之前经过简化并调整好视觉效果的模型继续工作流,为了使模型能受控制运动起来必须在合适的位置上添加相应的运动副/关节.一般情况下我们可以查阅手册或根据设计图纸获得这些关节的准确位置和姿态,知道这些 ...
- Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程
Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
随机推荐
- Python openpyxl使用教程
1.安装 openpyxl 组件 pip install openpyxl -i https://mirrors.aliyun.com/pypi/simple/ 新建Excel # coding=ut ...
- MySQL 如何实现数据更新
一般在更新时会遇到以下场景:1.所有字段全部更新:2.根据条件更新字段中的某部分内容:3.根据不同的条件更新不同的值,以下是几种场景中常用的update方法. 一.方法分类 二.具体用法 (1)根据条 ...
- C#,Winform软件防破译-源代码加密简单方法之.NET REACTOR(一)
一..NET Reactor介绍 .NET Reactor是一个功能强大的代码保护和软件许可系统,适用于为.NET Framework编写的软件,并支持生成.NET程序集的所有语言. 支持Blazor ...
- petite-vue和Vue的比较
petite-vue不止是变得更小,它还是渐进式增强的最佳实践. Vue不构建或构建都能使用.当通过构建使用时(例如使用单文件组件),Vue预编译所有的模板,所以运行时没有再处理模板.多亏了树摇(th ...
- 使用 LoRA 进行 Stable Diffusion 的高效参数微调
LoRA: Low-Rank Adaptation of Large Language Models 是微软研究员引入的一项新技术,主要用于处理大模型微调的问题.目前超过数十亿以上参数的具有强能力的大 ...
- 【笔记向】package.json main 作用
package.json main 作用 在 package.json 文件中,"main" 字段指定了这个包在被其他包依赖时,入口文件的文件名. 例如,如果在 package.j ...
- 【译】使用 ML.NET 进行机器学习 - 集群完整指南
原文 | Nikola M. Zivkovic 翻译 | 郑子铭 在之前的几篇文章中,我们探索了一些基本的机器学习算法.到目前为止,我们介绍了一些简单的回归算法,分类 算法.我们使用 ML.NET 实 ...
- Activiti02流程基本功能使用
主要分为一下几个步骤: 1.画图 2.部署流程-把图的信息转入到数据表格中 3.创建流程实例-开始一个流程-实际发起了一个流程 4.执行任务:获取任务+完成任务 1.画图 画了一个简单的流程图,图形文 ...
- [TJOI2007]书架
题目 网上搜 分析 我们可以认为插入一本书是在树中第 \(k\) 的位置进行插入操作 其中 \(k\) 为这本放入书架后的位置 考虑 \(fhq-treap\) 实现 我们将书编号为 \([0,n-1 ...
- DrCush_082020_血清阴性RA确诊延迟
转自Dr Jack Cush的Twitter (2020-08-20) 梅奥诊所:血清阴性RA的诊断存在延迟-血清阴性的首次关节肿胀距RA确诊为187天,而血清阳性者则为11天(P <.001) ...