一、OpenGL 渲染管线(Rendering Pipeline)的发展
1. 固定功能管线时代
-
在早期的 OpenGL(1.x 和 2.x 版本),渲染管线是固定的,开发者只能使用一组预定义的图形处理函数来进行渲染。这包括了顶点处理、光照计算、纹理映射、裁剪、混合等功能。这种管线的限制使得开发者无法对渲染过程进行深度控制,限制了创意和渲染效果的多样性。
-
缺点:
- 由于所有渲染处理都是硬件固定的,开发者无法自由定制处理过程。
- 光照模型、材质和效果都有限,无法实现复杂的现代渲染效果(如反射、折射、阴影、全局光照等)。
2. OpenGL 2.0:引入着色器
-
引入的关键特性:
- 着色器(Shaders):OpenGL 2.0 引入了第一个可编程管线的核心组成部分,即 GLSL(OpenGL Shading Language),使得开发者能够编写自己的顶点着色器和片段着色器。通过这些着色器,开发者可以对顶点、像素的处理过程进行自定义,从而实现更丰富的图形效果。
- 顶点着色器(Vertex Shader):允许开发者控制每个顶点的变换和属性。
- 片段着色器(Fragment Shader):使开发者能够控制像素的最终颜色,加入光照、纹理采样等操作。
-
标志性突破:
- 虽然 OpenGL 2.0 引入了着色器,但它仍然保持着固定管线的存在。也就是说,开发者可以在顶点处理和片段处理的阶段使用着色器,但固定管线的其他部分(如光照计算、纹理映射等)仍然由硬件自动完成。
3. OpenGL 3.0-4.0:可编程管线全面升级
-
引入的关键特性:
- 完全去除固定管线:从 OpenGL 3.0 开始,固定管线彻底被弃用。开发者必须完全依赖着色器来完成图形渲染的各个阶段。
- 几何着色器(Geometry Shader):在 OpenGL 3.2 中引入,几何着色器允许开发者在顶点着色器和片段着色器之间生成或修改图元(如从点生成三角形)。这极大增强了管线的灵活性。
- 多渲染目标(MRT,Multiple Render Targets):允许渲染多个图像或缓冲区,同时渲染,通常用于延迟渲染(Deferred Rendering)技术。
- 纹理映射增强:支持更先进的纹理映射技术,如立方体贴图(Cube Mapping)和多重纹理。
- 帧缓冲对象(FBO,Framebuffer Objects):允许离屏渲染,将渲染结果存储到纹理而不是屏幕中,用于后期处理或环境映射。
-
标志性突破:
- OpenGL 3.0 引入了完全可编程的渲染管线。顶点着色器、几何着色器和片段着色器都变成了开发者自定义的模块,光照、材质、几何体生成等都可以完全控制。
4. OpenGL 4.0-4.6:现代渲染技术的支持
-
引入的关键特性:
- 计算着色器(Compute Shader):OpenGL 4.3 引入了计算着色器,使得 GPU 计算任务不仅限于图形渲染,也可以用于图像处理、物理模拟、粒子系统等领域。这标志着 OpenGL 渲染管线不仅可以用于传统的图形渲染任务,还可以执行通用计算任务。
- Tessellation(细分):OpenGL 4.0 引入了细分着色器(Tessellation Shader),通过细分控制点,允许在图形管线中动态生成细节。它广泛应用于高质量曲面的渲染,如地形、复杂模型等。
- OpenGL 4.1-4.5:增强的性能与兼容性:这些版本主要对性能进行了优化,提升了对多核 GPU 的支持和扩展了跨平台的兼容性。
- OpenGL 4.5-4.6:图形管线增强与扩展:这些版本进一步增强了对先进图形技术的支持,如多维度着色器支持、GPU 资源管理、OpenGL 调试和性能优化工具等。
-
标志性突破:
- 计算着色器和细分着色器使得 OpenGL 成为一个全面的图形和计算平台,支持更复杂的图形效果和计算任务。
- 对于虚拟现实、电影制作、游戏开发等行业,OpenGL 4.0-4.6 提供了强大的渲染能力和灵活性。
-
5. 未来趋势:Ray Tracing 和 AI 加速
- Ray Tracing(光线追踪):随着硬件支持的改进,OpenGL 在光线追踪方面的支持逐渐增强。虽然 OpenGL 本身并不直接支持光线追踪,但它支持的扩展(如 Vulkan)和结合新的硬件特性(如 NVIDIA 的 RTX 系列显卡)使得开发者能够实现更高质量的光照效果和反射。
- AI 加速与机器学习:随着人工智能的应用日益增加,OpenGL 及其衍生的 Vulkan 也在支持 GPU 加速的机器学习模型方面有所发展。
二、固定渲染管线流程(3.1版本中已淘汰)
OpenGL 3.1删除了OpenGL 3.0中几乎弃用的所有功能。包括固定管线渲染。虽然被淘汰了,学习了解对OpenGL 的绘制渲染流程还是有帮助的。

1) Primitive Processing:
这一步是图元运算过程,所谓图元,其实就是一个点集。在OpenGL ES中,所有的物体,几何元素最终都是以顶点的形式表述的。一般来说,这些顶点将会产生三角形、直线或点。它做的工作就是将顶点提供给顶点处理器进行处理。顶点的数据包括顶点的位置(空间坐标)、大小、颜色、顶点的法向量(用于光照计算)、纹理坐标(可能有多个)等等。
2) Transform and Lighting:
这一步是转换和光照过程。其中Transform是通过模型、视图、投影变换矩阵,将所有的顶点坐标变换成人眼坐标系下的一致坐标。变换矩阵同样会改变物体的顶点法向量。如果激活了纹理,还可以进行纹理坐标转换,以及自动纹理坐标的生产。Lighting处理的就是光照部分,它会利用光源、材质、转换后的顶点位置和法向量计算每个顶点的颜色值。
3) Primitive Assembly:
图元装配过程。管线中这个流程是对所有的点数据进行点线面等基础图元的组装。这个过程会对所有的图元进行剪切和筛选。对于不在视区空间中的部分进行剪切,对于不可见的面进行筛选。
4) Resterizar:
光栅化。光栅化的过程就是对所有的经过Primitive Assembly图元转换成屏幕上可以显示的二维Fragment(片元)。片元和将要显示的像素一一对应。
5) Texture Environment:
纹理处理。利用纹理坐标来进行纹理的相关处理。
6) Colour Sum:
颜色叠加。根据纹理颜色等相关属性确定最终的顶点颜色。
7) Fog:
雾。雾化处理。
8) Alpha Test:
Alpha测试。判断某些片元是否抛弃。比如可以规定Alpha小于0.2的片元就需要抛弃。
9) Depth Stencil:
深度测试和模板测试。深度测试需要一个深度缓冲区,是在后面的会被在前的遮盖,需要抛弃。模板测试需要一个模板缓冲区,也就是模板缓冲区中为每个像素保存了一个“模板值”,当像素需要进行模板测试时,将设定的模板参考值与该像素的“模板值”进行比较,符合条件的通过测试,不符合条件的则被丢弃,不进行绘制。条件的设置与Alpha测试中的条件设置相似。但注意Alpha测试中是用浮点数来进行比较,而模板测试则是用整数来进行比较。
10) Color Buffer blend:
跟颜色缓冲区进行混合。最终生成的片元颜色需要跟颜色缓冲区中本来的进行混合(也可以理解成为跟背景混合,以生成最终的颜色。
11) Dither:
抖动。在可用颜色数量较少的系统中,可能需要对颜色值进行抖动,在适当损失颜色质量的情况下增加可使用的颜色数量。
12) Frame Buffer:
最终结果就写进了Frame Buffer。一个流程就算结束了。
-
三、现代可编程管线流程解析
OpenGL 的可编程管线发展经历了从固定功能管线到完全可编程管线的变革,逐步引入了着色器、几何着色器、计算着色器和细分着色器等先进功能,使得开发者能够在渲染管线的各个阶段进行自定义控制。这种灵活性使得开发者可以实现高质量的渲染效果,如 PBR(物理基础渲染)、复杂光照、后期处理、粒子系统等,同时也支持复杂的计算任务(如图像处理、AI 加速等)。



图中蓝色部分是可以编程控制的环节。
(一) 顶点处理阶段 (Vertex Processing)
在OpenGL的顶点处理阶段,主要由顶点着色器(Vertex Shader)负责处理每个输入的顶点数据。最常见的操作是将顶点从模型空间经过一系列变换(如视图变换、投影变换)转换到裁剪空间,同时根据其他顶点属性(如法线、颜色、纹理坐标)计算新的属性值,传递给后续的片段着色器。

输入:
- 顶点数据:顶点的位置、法线、颜色、纹理坐标等,这些数据通常保存在顶点缓冲对象(VBO)中。
- 顶点着色器的

最低0.47元/天 解锁文章
422

被折叠的 条评论
为什么被折叠?



