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 ...
随机推荐
- 如何在 C# 项目中链接一个文件夹下的所有文件
在 C# 项目中通过链接方式引入文件可以让我们在项目中使用这些文件中的代码.常见的比如链接 AssemblyInfo.cs 文件,这样我们就可以在项目中使用这个文件中的版本号等信息.但是如果我们想要链 ...
- 【一句话】Thread.sleep(0)的作用
首先一句话: 在循环中加入Thread.sleep(0),用于在循环中放入safepoint,JVM进行STW,然后触发GC. 详细: 说白了,它的作用就是给可数(int控制)循环加入safepoin ...
- WSL 配置输入法
安装输入法 sudo apt install dbus-x11 im-config fonts-noto fcitx fcitx-pinyin fcitx-sunpinyin fitx-googlep ...
- Centos7下areaDetector IOC的编译后记
https://github.com/EPICS-synApps/support/releases synApps出新版了,本文发文时的最新版为:R6-2 Centos7下areaDetector I ...
- playwright 实现高亮、is_visible 等源码修改
一. 前言 高亮是什么? 在ui自动化中可以执行js来让某个页面元素高亮,比如背景颜色.字体颜色.边框颜色等发生改变,以此更加方便执行的时候点了哪一步操作.(如果有不清楚怎么实现的可以转到我的介绍se ...
- CSP-S2022 总结
调整了下心态开考 顺序开题 看完 \(T1,T2\) 直接开打 \(T2\) 的线段树,还是比较好写的 然后思考先打 \(T1\) 呢还是拍 \(T2\),最后决定拍 \(T2\),稳一点 发现随机数 ...
- Vulhub 漏洞学习之:Apereo CAS
Vulhub 漏洞学习之:Apereo CAS 目录 Vulhub 漏洞学习之:Apereo CAS 1 Apereo CAS 4.1 反序列化命令执行漏洞 1.1 漏洞利用过程 1 Apereo C ...
- div 元素内容超出可通过鼠标滚轮实现横向滚动
移动端中的元素内容超出时,对容器设置overflow-x: auto就可以通过手势水平移动.但是 PC 端只能通过鼠标滚轮上下滑动,而不能水平移动. 只需要给元素添加一个监听鼠标滚轮事件,上下滑动时修 ...
- Postgresql临时表(TEMPORARY TABLE)
一.简介 PostgreSQL中的临时表分两种,一种是会话级临时表,一种是事务级临时表.在会话级临时表中,数据可以存在于整个会话的生命周期中,在事务级临时表中的数据只能存在于事务的生命周期中.默认创建 ...
- C# datatable group by分组
DataTable dt = new DataTable(); dt.Columns.Add("A"); dt.Columns.Add("B"); dt.Col ...