2080 字
10 分钟
OpenGL学习笔记

一、简介#

OpenGL(Open Graphics Library)是一个跨编程语言、跨平台的编程图形程序接口,它将计算机的资源抽象称为一个个OpenGL的对象,对这些资源的操作抽象为一个个的OpenGL指令。 OpenGL有着以下主要特性:

1. 低层次的渲染 API#

OpenGL 提供了直接与图形硬件进行交互的能力。这使得它非常强大,因为它可以充分利用图形处理器(GPU)的性能。然而,这也意味着使用 OpenGL 需要对计算机图形学有深入的理解。

2. 状态机#

OpenGL 是一个状态机,这意味着你可以通过一系列的函数调用来改变它的内部状态,然后这些状态会影响后续的渲染操作。

3. 可扩展性#

OpenGL 的一个重要特性是它的可扩展性。硬件制造商可以为他们的硬件特性定义新的 OpenGL 函数和参数。这些扩展可以通过 OpenGL 的扩展机制被查询和使用。

4. 跨平台和跨语言#

OpenGL 可以在所有主要的操作系统(如 Windows、macOS 和 Linux)上运行,并且有各种编程语言的绑定,包括 C、C++、Python、Java 和许多其他语言。

5. 显示列表和着色器#

OpenGL 提供了两种主要的方式来指定如何渲染图形。一种是通过使用显示列表来指定一系列的顶点和参数。另一种是通过使用着色器,这是一种在 GPU 上运行的小程序,可以控制图形的最终颜色和位置。

二、前置知识#

在学习OpenGL之前,以下是一些应该需要了解的技术和知识:

1.编程语言#

OpenGL 是一个 C 语言库,因此理解 C 语言(或 C++)的基本知识是非常有用的。然而,许多其他语言(如 Python、Java、JavaScript 等)也有 OpenGL 的绑定,所以你可以选择你最熟悉的语言来学习。

2.计算机图形学基础#

理解基本的计算机图形学概念,如向量、矩阵、变换、光照、纹理等,可以帮助你更好地理解和使用 OpenGL。这些主题通常在计算机图形学的入门课程中介绍。

3.线性代数#

在计算机图形学中,我们经常需要处理 2D 或 3D 空间中的点和向量,这需要一些线性代数的知识。至少要熟悉向量的加法、减法和点积,以及如何使用矩阵进行变换。

4.计算机硬件#

理解计算机硬件,特别是图形处理器 (GPU) 的基本工作原理,可以帮助你理解 OpenGL 的许多设计决策,以及为什么某些操作比其他操作更快。

5.IDE 和调试工具#

熟悉一个集成开发环境(如 Visual Studio、Eclipse 或者 PyCharm)将会对你编写和调试代码非常有帮助。此外,学习使用像 gDEBugger 或者 RenderDoc 这样的 OpenGL 调试工具也是很有用的。

6.API 文档和教程#

熟悉 OpenGL 的官方文档(或你正在使用的语言绑定的文档)。这将是你在学习和使用 OpenGL 时的重要资源。同时,还有许多优秀的在线教程,如 learnopengl.com。

三、OpenGL的基本概念#

1.工作流程#

定义图形数据#

首先,你需要定义你要渲染的图形数据,这些数据主要包括顶点数据。例如,如果你要渲染一个三角形,你就需要定义三个顶点的坐标。这些数据通常存储在顶点缓冲对象(Vertex Buffer Object,VBO)中。

定义着色器程序#

着色器是运行在图形处理器(GPU)上的小程序,用于控制图形的渲染过程。最常见的着色器类型有顶点着色器(Vertex Shader)和片元着色器(Fragment Shader)。顶点着色器用于处理顶点数据,片元着色器用于计算像素的颜色。

渲染图形#

在图形数据和着色器程序都准备好之后,你可以调用 OpenGL 的函数来渲染图形。在渲染过程中,OpenGL 会根据你设置的状态和着色器程序来处理顶点数据,生成图形,并将图形绘制到一个叫做帧缓冲(Frame Buffer)的内存区域。

显示图形#

最后,你可以将帧缓冲的内容显示到屏幕上。这通常是通过交换前后帧缓冲(在双缓冲模式下)或者直接复制帧缓冲的内容到屏幕上完成的。

2.基本组件#

顶点(Vertex)#

顶点是构成图形的基本元素。一个顶点主要包含位置信息,但也可能包含颜色、法线、纹理坐标等其他信息。在 OpenGL 中,顶点数据通常存储在顶点缓冲对象(VBO)中,并通过顶点数组对象(VAO)来管理。

坐标(Coordinates)#

OpenGL 使用坐标来描述顶点的位置。在 3D 空间中,每个顶点都有一个三维坐标(x, y, z)。在 OpenGL 中,所有的坐标都被归一化到一个叫做裁剪空间(Clip Space)的立方体中,这个立方体的中心位于原点,长度、宽度和高度都是 2。

颜色(Color)#

颜色用于描述顶点或者片元的颜色。在 OpenGL 中,颜色通常由红、绿、蓝三个分量来表示,每个分量的值在 0 到 1 之间。有时候还会有一个额外的分量 alpha,用于表示颜色的透明度。

纹理(Texture)#

纹理是一个图像,可以被映射到图形的表面上,增加图形的细节。每个顶点都可以有一个或多个纹理坐标,用于指定纹理的哪一部分应该被映射到顶点上。在 OpenGL 中,纹理数据通常存储在纹理对象中。

着色器(Shader)#

着色器是运行在 GPU 上的小程序,用于控制图形的渲染过程。顶点着色器(Vertex Shader)用于处理顶点数据,片元着色器(Fragment Shader)用于计算像素的颜色。

帧缓冲(Frame Buffer)#

帧缓冲是一个内存区域,用于存储渲染的结果。在渲染过程中,OpenGL 会将图形绘制到帧缓冲中。帧缓冲中的数据最终可以被复制到屏幕上,或者被保存为图像文件。

3.状态机模型#

OpenGL 使用一种称为 “状态机” 的模型来管理它的操作。这意味着在任何给定的时间点,OpenGL 都有一组相关的 “状态” ,这些状态会影响 OpenGL 的操作和行为。

状态机模型的工作方式是,你设置一些状态,然后执行一些操作,这些操作会根据当前的状态来执行。例如,你可以设置颜色状态为红色,然后绘制一个形状,这个形状就会被渲染成红色。如果你改变颜色状态为蓝色,然后再绘制一个形状,那么新的形状就会被渲染成蓝色。

OpenGL 的状态包括诸如当前的颜色、光照参数、纹理参数、视口大小、裁剪平面等等。这些状态可以通过特定的 OpenGL 函数进行设置。例如,使用 glColor3f 函数可以设置当前的颜色,使用 glViewport 函数可以设置视口大小。

一旦设置了 OpenGL 的某个状态,该状态就会保持不变,直到你明确地改变它。这就是为什么 OpenGL 被称为状态机:它保存了一系列的状态,这些状态在调用绘图命令时决定了行为。

一个重要的概念是,OpenGL 的状态是全局的。这意味着如果你在一部分代码中改变了状态,那么这个改变会影响到所有后续的 OpenGL 调用,直到你再次改变那个状态。这就是为什么良好的编程实践是在更改了 OpenGL 状态后尽快恢复它,这样你就不会意外地影响到其他部分的代码。

总的来说,理解 OpenGL 是一种状态机,并且知道如何设置和管理这些状态,是有效使用 OpenGL 的关键。

OpenGL学习笔记
https://kyc001.github.io/posts/opengl学习笔记/
作者
kyc001
发布于
2025-04-10
许可协议
CC BY-NC-SA 4.0