Skip to content

Latest commit

 

History

History
151 lines (70 loc) · 5.85 KB

File metadata and controls

151 lines (70 loc) · 5.85 KB

About OpenGL

Tools

GLFW(Graphics Library Framework)

用途

  • 创建和管理 窗口
  • 处理 输入事件(键盘、鼠标、手柄)
  • 管理 OpenGL 上下文
  • 跨平台支持(Windows、Linux、macOS)

GLFW 是针对 OpenGL 的 c 语言库,提供了一些最基础的绘制图形的接口

GLAD(OpenGL Loader Generator)

用途

  • 在运行时 加载 OpenGL 函数指针
  • 根据指定的 OpenGL 版本生成对应的加载代码
  • 替代早期的 GLEW,配置更灵活、现代化

GLAD 是一个开源的库,用来解决不同驱动不同显卡之间, OpenGL 函数无法确定在编译期确定的问题。保证跨平台调用一致

概念

双缓冲(Double Buffer)

​ 应用程序使用单缓冲绘图时可能会存在图像闪烁的问题。 这是因为生成的图像不是一下子被绘制出来的,而是按照从左到右,由上而下逐像素地绘制而成的。最终图像不是在瞬间显示给用户,而是通过一步一步生成的,这会导致渲染的结果很不真实。为了规避这些问题,我们应用双缓冲渲染窗口应用程序。缓冲保存着最终输出的图像,它会在屏幕上显示;而所有的的渲染指令都会在缓冲上绘制。当所有的渲染指令执行完毕后,我们交换(Swap)前缓冲和后缓冲,这样图像就立即呈显出来,之前提到的不真实感就消除了。

关于 VAO VBO EBO

  • 顶点数组对象:Vertex Array Object,VAO
  • 顶点缓冲对象:Vertex Buffer Object,VBO
  • 元素缓冲对象:Element Buffer Object,EBO 或 索引缓冲对象 Index Buffer Object,IBO

VAO(Vertex Array Object)

  • 作用:存储顶点属性配置(状态记录)(比如顶点数据如何解释、绑定了哪个 VBO/EBO)。
  • 本质:一个状态容器,记录了顶点数据的布局。
  • 优点:避免每次绘制都重新写 glVertexAttribPointer 等配置,只需绑定 VAO。
  • 使用场景:管理不同模型的顶点数据布局。

VBO(Vertex Buffer Object)

  • 作用:存储顶点数据(位置、颜色、法线、纹理坐标等)。
  • 本质:显存中的一块缓冲区,用来替代传统的 glBegin/glEnd 方式。
  • 优点:数据一次传入 GPU,渲染时直接从显存读取,效率更高。
  • 使用场景:比如存储一个三角形的三个顶点坐标。

EBO(Element Buffer Object,也叫 Index Buffer)

  • 作用:存储顶点索引,用来避免重复顶点数据。

  • 本质:告诉 GPU 按照索引顺序去 VBO 中取顶点。

  • 优点:减少冗余数据。例如绘制一个正方形时,只需 4 个顶点,但可以通过索引绘制 2 个三角形,而不用重复写 6 个顶点。

  • 使用场景:任何需要复用顶点的图形(网格、模型)。

​ 一个直观比喻

  • VAO:像书签,帮你记住字典和目录的使用方式,下次直接翻到正确页。
  • VBO:像一本字典,里面存放所有单词(顶点数据)。
  • EBO:像目录索引,告诉你哪些单词组成句子(索引绘制)。

VAO 和 VBO 的工作流程

CPU: glBindVertexArray(VAO) → 绑定一个 VAO,之后的所有顶点属性配置都会记录到这个 VAO 中。

CPU**:** glBindBuffer(GL_ARRAY_BUFFER, VBO) → 把某个 VBO 绑定到 GL_ARRAY_BUFFER 目标。此时 VAO 并不会立刻记录 VBO,而是等待调用属性配置函数。

CPU**:** glVertexAttribPointer(...) → 定义顶点属性的数据布局(分量数、类型、步长、偏移量)。 在这个调用的瞬间,VAO 会把当前绑定的 VBO + 属性解析方式一起记录下来。

CPU: glEnableVertexAttribArray(...) → 启用对应的顶点属性。VAO 会记录该属性的启用状态。

VAO 与 VBO 并不是严格的 一对多 关系,而是灵活的 多对多 关系

为什么有了 VAO VBO ,还要引入 EBO 呢?

EBO 的基本作用
  • VBO:存放顶点数据(坐标、颜色等)。
  • EBO:存放顶点索引(整数数组),告诉 GPU 按照这些索引去 VBO 里取顶点。

这样,绘制时不再是顺序读取所有顶点,而是根据索引表来“重用”顶点。

为什么用顶点索引来读取数据会更加高效?
  • 没有 EBO:绘制矩形需要 6 个顶点(两个三角形),即使有重复的点也要写两次。
  • 有 EBO:只需存 4 个顶点,索引数组告诉 GPU如何组合它们成两个三角形。

这样就避免了顶点数据的冗余,节省显存和带宽,同时减少 CPU→GPU 的传输量。

图形渲染管线

![pipeline](D:\VS Project\LearnOpenGL\pipeline.png)

​ 在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素。3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线(Graphics Pipeline,大多译为管线,实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程)管理的。

简单来说就是两个步骤:

  • 将物体的 3d 坐标变化为屏幕空间 2d 坐标
  • 为屏幕的每个像素点着色

​ 2D坐标和像素也是不同的,2D坐标精确表示一个点在2D空间中的位置,而2D像素是这个点的近似值,2D像素受到你的屏幕/窗口分辨率的限制。

着色器(Shader)

MVP变换矩阵

MVP 矩阵分别是 model -> view -> projection

局部空间 -> (model) -> 世界空间 -> (view) -> 观察空间 -> (Projection) -> 剪裁空间 -> (透视除法) -> NDC -> (视口转换) -> 屏幕坐标

M: 模型空间 -> 世界空间 V: 世界空间 -> 观察空间 P: 观察空间 -> 剪裁空间