GLFW:
GLFW是一个开源的跨平台库,用于创建窗口、处理用户输入、创建OpenGL上下文以及管理OpenGL扩展。它提供了一个简单的接口,方便开发者在不同的操作系统上创建和管理OpenGL应用程序窗口,处理用户输入事件等。
GLAD:
GLAD(OpenGL Loader Generator)是一个用于加载和管理OpenGL函数指针的库。在使用OpenGL时,我们需要加载和绑定特定的OpenGL函数,以便在程序中调用它们。GLAD可以根据我们所使用的OpenGL版本和扩展,生成相应的加载代码,并自动解析函数指针,使我们能够使用OpenGL的各种功能。
GLM:
GLM(OpenGL Mathematics)是一个用于数学运算的C++数学库,专门为OpenGL编程而设计。它提供了向量、矩阵、四元数等数据结构和相应的运算操作,以及常见的数学函数和工具函数,方便在OpenGL程序中进行数学计算和变换操作。GLM的接口和语法与OpenGL的GLSL着色器语言非常相似,使得在编写OpenGL代码时能够更加方便和一致。
DX坐标系是 |------>
V
OPenGL是 +
屏幕不是正方形,画圆圈变椭圆,所有要除以宽高比
每个像素点都是3个灯泡,亮度又256的级别
我们输入的是浮点数,但最后是一个离散的0~255的整数
屏幕也有Z轴
glVertex3f参数是float,但c默认小数是double,float要加f
点线面
LeranOpenGL
第一个窗口
导库
#include <glad/glad.h>
#include <GLFW/glfw3.h>
glfw的 初始化和配置
创建一个窗口
把窗口设置为当前上下文窗口
设置帧缓冲回调函数
把opengl所有的函数指针交给GLAD管理
创建渲染循环(Render Loop),不停的
听按键,
执行所有的渲染指令
检查并调用事件
交换缓冲
释放资源
画三角形
必须定义至少一个顶点着色器和一个片段着色器
顶点数组对象:Vertex Array Object,VAO
顶点缓冲对象:Vertex Buffer Object,VBO
元素缓冲对象:Element Buffer Object,EBO 或 索引缓冲对象 Index Buffer Object,IBO
渲染器前
写所有着色器源码
顶点着色器*n
片段着色器*n
创建所有着色器
顶点着色器*n
片段着色器*n
创建所有任务
黄色
橙色
将所有源码和着色器绑定
顶点
黄色片段
橙色片段
编译所有源码
.
.
.
链接所有任务
附加顶点
附加片段
链接任务
创建并图形顶点数组
定义对象数组
VAO【】
VBO【】
生成对象
顶点数组
缓冲
画一个图形
绑定顶点数组对象
绑定缓存冲
给缓存数据
设定顶点属性指针
渲染循环中
使用一个任务
绑定一个顶点对象
绘画并指定图形形状
结束后
释放顶点数组对象
释放缓冲
释放每个任务
疑问点
纹理
undefined reference to `stbi_load'
undefined reference to `stbi_image_free'
stbi_image库的使用
stb/stb_image.h at master · nothings/stb · GitHub (githubfast.com)
直接导入头文件即可,不需要链接库,他的实现都在头文件里实现了
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
生成、绑定纹理texture
设置临近过滤、线性过滤
设置多级渐远纹理
宽、高、通道个数
加载图片数据
生成纹理和绑定多级纹路
释放data
易错点1
glad_glTexParameteri() // v
glad_glTextureParameterIiv // x
易错点2
glad_glGenerateMipmap(GL_TEXTURE_2D);不要忘记
关于告诉着色器如何解析数据
着色器
数据
如何解析
// position attribute
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
// 步长为 8(3+3+2)对于顶点来说,从0开始就是顶点,所以偏移量=0
glEnableVertexAttribArray(0);
// color attribute
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));
// 步长为 8(3+3+2)对于颜色来说,从3开始就是顶点,所以偏移量=3
glEnableVertexAttribArray(1);
// texture coord attribute
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
glEnableVertexAttribArray(2);
//第一个参数指定我们要配置的顶点属性。还记得我们在顶点着色器中使用layout(location = 0)定义了position顶点属性的位置值(Location)吗?它可以把顶点属性的位置值设置为0。因为我们希望把数据传递到这一个顶点属性中,所以这里我们传入0。
//第二个参数指定顶点属性的大小。顶点属性是一个vec2,它由2个值组成,所以大小是2。
顶点的缩放
向量 点乘 单位向量不便
【3】* 【0.5,0】= 【1/5】
【2】 【0,2】= 【4】
顶点的位移
位移是向量相加。但为了运算方便,用改变的单位矩阵来点成 达到加法。
第四给坐标是 齐次坐标,是为了创建3D效果
旋转
旋转的视频
无所不能的矩阵 - 三维图形变换_哔哩哔哩_bilibili
旋转
2维
3维
这里的旋转矩阵可能有误,Rx和Rz换一下就对了
齐次坐标的作用
扩大视角,可以用缩放来实现
通过齐次坐标来实现除法