# 三维图形处理 - 3D GPU

## 模块描述
3D GPU 是现代图形和计算领域的核心组件，它不仅支持高效的 3D 渲染，还广泛应用于科学计算、人工智能、数据可视化等领域。其硬件加速能力和高并行架构为各类复杂任务提供了强大的支持。

### 框架描述
3D GPU 框架如下图描述 :<br>
**注意**： X5 BSP 默认没有移植桌面系统，可以基于 DRM 和 GBM 实现 GPU 渲染效果的展示（如图中 Framework 层的黄色部分）。

![gpu_3d_descript_framework](./media/gpu_3d_descript_framework.png)

下面对各个层进行单独描述：（从下向上的顺序）

1. 硬件层： GPU Core 是具体的 GPU 硬件，完成 3D 图像处理加速，渲染的输出结果可以存储到 DDR 中
2. 内核驱动层： X5 中 GPU 的驱动没有接入 DRM，而是通过字符设备驱动的 `ioctl` 接口向上提供接口
3. 用户驱动层：通过封装 `ioctl` 接口，实现 GPU 接口层和驱动层的交互
4. Framework 层 : 包含 4 个层次
   - GPU 接口层（绿色背景部分）包括四种标准 API： EGL、 OpenGL ES、 Vulkan 和 OpenCL，详细说明将在后续内容中提供
   - 服务器协议层：常见的显示服务器协议有 Wayland 和 X11 ，其中 Wayland 是 X11 的替代，其中常见 Wayland 协议的具体实现有： Mutter 和 KWin
   - 桌面环境： GnomeShell 和 KDE 都是现代化的桌面环境，基于 Wayland 协议负责用户交互界面
      - GnomeShell 基于 Mutter（ Wayland 协议的具体实现）
      - KDE 基于 KWin（ Wayland 协议的具体实现）
   - 图形工具包： GTK 和 Qt 是两种不同的 GUI 工具包，它们为开发者提供图形控件和界面构建工具
5. 应用层：应用层的实现有两种情况：
   - 情况 1 ：有桌面环境的情况，应用层可以基于各种图像库开发复杂的游戏和 UI 界面
   - 情况 2 ：没有桌面环境的情况（图中黄色背景： [sample_gpu_3d](../samples/sample_gpu_3d.html)），应用层直接调用 GPU 接口，通过 DRM 和 GBM 实现 GPU 渲染图像的显示
### 常用功能描述

| 功能                  | 描述                                                                                 | 常见用途                                                                                     |
|-----------------------|-------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|
| 顶点处理（ Vertex Processing） | 处理三维模型的顶点坐标，包括坐标变换（如 3D 模型、视图和投影变换）以及法线、纹理坐标等相关计算。 | 将三维模型投影到屏幕上的二维平面；应用动画（骨骼动画、顶点形变等）。                          |
| 光栅化（ Rasterization） | 将三角形等几何图元转换为像素（或片元）。                                               | 将 3D 几何图形渲染到 2D 显示器；实现边缘检测和抗锯齿等技术。                                  |
| 片元处理（ Fragment Processing） | 计算每个像素的颜色和其他属性（如深度、透明度）。                                  | 实现复杂的材质效果（如金属、玻璃）；计算灯光、阴影、反射等效果。                               |
| 纹理映射（ Texture Mapping） | 将二维纹理图片贴合到 3D 模型表面。                                                   | 添加表面细节，如木纹、皮肤、墙面；使用法线贴图实现精细的凹凸效果。                              |
| 渲染管线（ Rendering Pipeline） | 从几何数据到最终图像的全流程处理，包括顶点着色、几何着色、光栅化、片元着色等阶段。       | 高效完成实时渲染任务，如游戏中的实时画面。                                                    |
| 阴影计算（ Shading）      | 使用着色器程序计算光线与物体交互的视觉效果。                                           | 实现光影变化（如漫反射、高光反射）；实现环境光遮蔽、全局光照等高级渲染效果。                   |
| 帧缓冲处理（ Framebuffer Operations） | 管理渲染目标和中间数据（颜色缓冲、深度缓冲等）。                                 | 实现后期处理效果（如模糊、色调映射）；保存渲染结果用于多重采样或离屏渲染。                      |
| 几何处理（ Geometry Processing） | 处理几何图元（如三角形、点、线）以生成复杂形状。                                  | 实现动态网格变形、粒子系统等效果；应用几何着色器添加细节。                                    |
| 计算着色器（ Compute Shader） | 提供通用计算能力，突破传统图形渲染管线的限制。                                      | 实现物理模拟（如流体、布料）；进行大规模并行计算任务（如 AI 推理、光线追踪加速）。              |
| 光线追踪（ Ray Tracing）  | 通过模拟光线与场景物体的交互生成更逼真的画面。                                       | 实现真实的反射、折射、阴影和全局光照；应用于高质量渲染和实时渲染。                              |


### 应用场景

| 应用场景            | 详细说明                                                                                                             |
|---------------------|---------------------------------------------------------------------------------------------------------------------|
| **游戏开发**         | 渲染复杂游戏场景，实现实时阴影、动态光源等效果，适用于开放世界、高帧率竞技游戏及 VR 游戏。                                                             |
| **影视和动画**       | 离线渲染高质量图像，支持高级光照技术（如全局光照），用于动画电影和特效制作。                                                                             |
| **虚拟现实和增强现实** | 高帧率渲染减少延迟，用于 VR 游戏、 AR 导航以及医疗培训。                                                                                              |
| **工业设计和建模**   | 实时渲染复杂模型，用于汽车设计、建筑可视化和产品仿真。                                                                                                   |
| **科学计算和数据可视化**| 加速科学模拟与 3D 数据渲染，应用于气候模拟、医学成像和基因研究。                                                                                       |
| **人工智能和深度学习**| 提供并行计算能力，加速模型训练和推理，应用于图像识别、 NLP 和自动驾驶技术。                                                                               |
| **建筑和工程**       | 实现高保真可视化和实时漫游，用于建筑设计评审和智慧城市规划。                                                                                             |
| **医疗和仿真**       | 生成实时 3D 可视化，支持手术模拟和疾病建模。                                                                                                            |
| **云游戏和远程渲染** | 在远程 GPU 上进行渲染，并将结果流式传输到客户端，适用于云游戏和远程计算服务。                                                                                |


### 基础规格

峰值算力为 **32GFLOPS**


## 参考示例
- 3D GPU 接口示例代码可以参考 [sample_gpu_3d](../samples/sample_gpu_3d.html)  章节

## API 参考
X5 3D GPU 支持四种标准 API： EGL、 OpenGL ES、 Vulkan 和 OpenCL，具体描述如下：

|API|	主要用途 |	依赖关系 |	主要应用场景 |API 官方链接 | 支持的版本 |
|----|-----------|-----------|-------------------|-------------------|-------------------|
|EGL|	管理上下文和窗口表面 |	提供给 OpenGL ES 和 Vulkan 使用 |	图形上下文管理 |[EGL](https://registry.khronos.org/EGL/) |EGL 1.5|
|OpenGL ES|	嵌入式图形渲染 |	依赖 EGL| 游戏、 UI 渲染 |[OpenGL ES](https://registry.khronos.org/OpenGL/index_es.php)| OpenGL ES 3.1 / 3.0 / 2.0 / 1.1|
|Vulkan|	高性能图形和计算渲染 |	可选依赖 EGL|	游戏、 UI 渲染 | [Vulkan](https://registry.khronos.org/vulkan/)|Vulkan|
|OpenCL|	通用并行计算 |	- |	图像处理、机器学习、科学计算 |[OpenCL](https://registry.khronos.org/OpenCL/)|OpenCL 1.1 / 1.2 / 3.0|


### 头文件说明
在编写 OpenGL ES， Vulkan 或 OpenCL 应用程序的过程中会使用到相关标准协议的头文件，这些头文件所在的文件夹和简述如下表所示：

| 标准                        | 头文件所在的文件夹                         | 文件夹简述 |
|-----------------------------|------------------------------|-------------------|
|EGL|EGL| 包含 EGL 所有版本的头文件 |
|GBM|-| 包含 GBM 的头文件 |
|OpenGL ES|GLES GLES2 GLES3| 包含 OpenGL ES2.x 相关的头文件，且包含 OpenGL ES 拓展相关的头文件 <br> 包含 OpenGL ES3.x 相关的头文件 |
|Vulkan|vulkan| 包含 vulkan 的头文件 |
|OpenCL|CL| 包含 OpenCL C 风格的头文件 <br> 包含 OpenCL CPP 风格的头文件 |

### 动态库说明
在编写 OpenGL ES， Vulkan 或 OpenCL 应用程序的过程中会使用到相关标准的动态库，相关动态库的名称如下表所示：

| 标准                        | 动态库名称                         | 动态库简述 |
|-----------------------------|------------------------------|-------------------|
|EGL|libEGL.so|EGL 动态库 |
|GBM|libgbm.so|GBM 动态库 |
|OpenGL ES|libGLESv2.so libGLESv1.so|OpenGL ES2.x 和 OpenGL ES3.x 动态库 OpenGL ES1.x 动态库 |
|Vulkan|libvulkan.so|Vulkan ICD Loader 动态库 |
|OpenCL|libOpenCL.so|OpenCL 动态库 |



