Administrator
发布于 2023-11-06 / 8 阅读 / 0 评论 / 0 点赞

OpenGL 专题

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

第一个窗口

Code Viewer. Source code: src/1.getting_started/1.2.hello_window_clear/hello_window_clear.cpp (learnopengl.com)

  1. 导库

#include <glad/glad.h>
#include <GLFW/glfw3.h>
  1. glfw的 初始化和配置

  2. 创建一个窗口

  3. 把窗口设置为当前上下文窗口

  4. 设置帧缓冲回调函数

  5. 把opengl所有的函数指针交给GLAD管理

  6. 创建渲染循环(Render Loop),不停的

    1. 听按键,

    2. 执行所有的渲染指令

    3. 检查并调用事件

    4. 交换缓冲

  7. 释放资源

画三角形

必须定义至少一个顶点着色器和一个片段着色器

  • 顶点数组对象:Vertex Array Object,VAO

  • 顶点缓冲对象:Vertex Buffer Object,VBO

  • 元素缓冲对象:Element Buffer Object,EBO 或 索引缓冲对象 Index Buffer Object,IBO

渲染器前

  1. 写所有着色器源码

    1. 顶点着色器*n

    2. 片段着色器*n

  2. 创建所有着色器

    1. 顶点着色器*n

    2. 片段着色器*n

  3. 创建所有任务

    1. 黄色

    2. 橙色

  4. 将所有源码和着色器绑定

    1. 顶点

    2. 黄色片段

    3. 橙色片段

  5. 编译所有源码

    1. .

    2. .

    3. .

  6. 链接所有任务

    1. 附加顶点

    2. 附加片段

    3. 链接任务

  7. 创建并图形顶点数组

  8. 定义对象数组

    1. VAO【】

    2. VBO【】

  9. 生成对象

    1. 顶点数组

    2. 缓冲

  10. 画一个图形

    1. 绑定顶点数组对象

    2. 绑定缓存冲

    3. 给缓存数据

    4. 设定顶点属性指针

渲染循环中

  1. 使用一个任务

  2. 绑定一个顶点对象

  3. 绘画并指定图形形状

结束后

  1. 释放顶点数组对象

  2. 释放缓冲

  3. 释放每个任务

疑问点

纹理

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"

  1. 生成、绑定纹理texture

  2. 设置临近过滤、线性过滤

  3. 设置多级渐远纹理

  4. 宽、高、通道个数

  5. 加载图片数据

  6. 生成纹理和绑定多级纹路

  7. 释放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换一下就对了

齐次坐标的作用

扩大视角,可以用缩放来实现

通过齐次坐标来实现除法


评论