// 序章
最开始我以为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窗口的更多相关文章

  1. OpenGL学习-------visual studio 2010配置和第一个OpenGL程序讲解

    OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性. 1.与C语言紧密结合. OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenG ...

  2. MyBatis学习笔记(一)创建第一个MyBatis项目

    一.新建Maven项目 http://www.mybatis.org/mybatis-3/zh/index.html 该链接为MyBatis官方地址 创建MyBatis项目主要有两种办法,一种是导入j ...

  3. 【学习笔记】python 简单创建新建一个网络客户端,并返回相关的信息

    #导入socket包 import socket #使用socket.socket创建socket连接 #AF_INET表示通信类型,与IPv4对应 #SOCK_STREAM对应TCP通信 print ...

  4. django学习笔记【002】创建第一个django app

    2.3.3 1.创建一个名叫polls的app python3. manage.py startapp polls tree mysite/ mysite/ ├── db.sqlite3 ├── ma ...

  5. OpenGL学习笔记:拾取与选择

    转自:OpenGL学习笔记:拾取与选择 在开发OpenGL程序时,一个重要的问题就是互动,假设一个场景里面有很多元素,当用鼠标点击不同元素时,期待作出不同的反应,那么在OpenGL里面,是怎么知道我当 ...

  6. opengl学习笔记(二):使用OpenCV来创建OpenGL窗口

    通常的增强现实应用需要支持OpenGL的OpenCV来对真实场景进行渲染.从2.4.2版本开始,OpenCV在可视化窗口中支持OpenGL.这意味着在OpenCV中可轻松渲染任何3D内容. 若要在Op ...

  7. OpenGL学习笔记3——缓冲区对象

    在GL中特别提出了缓冲区对象这一概念,是针对提高绘图效率的一个手段.由于GL的架构是基于客户——服务器模型建立的,因此默认所有的绘图数据均是存储在本地客户端,通过GL内核渲染处理以后再将数据发往GPU ...

  8. V-rep学习笔记:机器人模型创建3—搭建动力学模型

    接着之前写的V-rep学习笔记:机器人模型创建2—添加关节继续机器人创建流程.如果已经添加好关节,那么就可以进入流程的最后一步:搭建层次结构模型和模型定义(build the model hierar ...

  9. V-rep学习笔记:机器人模型创建2—添加关节

    下面接着之前经过简化并调整好视觉效果的模型继续工作流,为了使模型能受控制运动起来必须在合适的位置上添加相应的运动副/关节.一般情况下我们可以查阅手册或根据设计图纸获得这些关节的准确位置和姿态,知道这些 ...

  10. Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程

    Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

随机推荐

  1. 洛谷 P3916 图的遍历

    题目链接 最容易想的思路:对于每一个点都进行dfs/bfs,时间复杂度为O(n*(n+m)),显然超时 可以使用类似记忆化的操作,一个点能到达的最大值是自己所有能达到的边的最大值,则可以递归来做 但有 ...

  2. java画海报

    package demotest; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; impor ...

  3. 【Oculus Interaction SDK】(六)实体按钮 && 按压交互

    前言 这篇文章是[Oculus Interaction SDK]系列的一部分,如果发现有对不上的对方,可以回去翻看我之前发布的文章,或在评论区留言.如果文章的内容已经不适用于新版本了,也可以直接联系我 ...

  4. 【LeetCode字符串#05】基于个人理解的KMP算法图解,以及应用到strStr()函数实现

    KMP算法(用于实现 strStr()) strStr()函数是用来在一个字符串中搜索是否存在另一个字符串的函数,其匹配字符串方式为KMP算法 KMP算法基础理论 假设有如下两个字符串 文本串 aab ...

  5. springboot 多数据源 实例(sybase、mysql数据库)(上)

    最近项目 需要用到 sybase(sql anywhere).mysql 数据库 两边数据交互 .由于之前对sybase 数据库一点不懂 踩了许多坑 特意记下: 连接 sybase 客户端需要用到 S ...

  6. Spring03-IOC-循环依赖的实现(Debug查看spring解决循环依赖的过程)

    1 什么是循环依赖 如下,有类A和B,A中有一个类型为B的属性b,B中有一个类型为A的属性a,A和B相互依赖 public class A { private B b; public B getB() ...

  7. JZOJ 2022.07.06【提高组A】模拟

    历程 被暴打了 原因是钻进了 \(T4\) 的坑中... 先看完题,发现 \(T4\) 比较有意思,\(T2\) 没有想法 \(T3\) 挺容易,做法似乎很好想 \(T1\) 送分,十几分钟搞定 然后 ...

  8. computed与watch的区别

    1.computed表示的是计算属性,watch指的是监听属性,监听的值变化时执行回调函数 2.computed会使用缓存,而watch不使用缓存,每次监听都执行回调 3.computed需要retu ...

  9. KingbaseES R6集群物理copy方式手工添加新备库节点

    案例说明:对于主库数据量比较大的环境,在添加新节点是可以采用在线clone方式创建新的备库节点,也可以在离线的状态下,直接拷贝其中一个备库的所有集群相关目录来创建新的备库节点.本案例介绍了通过离线物理 ...

  10. P2910 [USACO08OPEN]Clear And Present Danger S题解

    bfac3402-1150-46c7-8798-f545389dbac3 其使用最简单的方法做就好了忘了啥名字,类似于dp 给个代码 #include<bits/stdc++.h> usi ...