|
| 1 | +概述 |
| 2 | +============ |
| 3 | + |
| 4 | +```{translation-warning} Outdated Translation, /introduction.md |
| 5 | +这是[原英文页面](%original%)的**社区翻译**,自翻译以来有已更新,因此可能不再同步。欢迎您的[贡献](%contribute%)! |
| 6 | +``` |
| 7 | + |
| 8 | +什么是图形API? |
| 9 | +----------------------- |
| 10 | + |
| 11 | +我们的个人电脑和智能手机通常包含两个单元:**CPU**(*Central Processing Unit* 中央处理单元)和**GPU**(*Graphics Processing Unit* 图形处理单元)。编写应用程序时,**主要是为CPU编写命令**,这就是大多数编程语言的用途。 |
| 12 | + |
| 13 | +```{figure} /images/architecture-notes.png |
| 14 | +:align: center |
| 15 | +CPU和GPU是两种不同的处理器,我们对CPU进行编程,使其通过图形API和驱动程序指导GPU应该做什么。 |
| 16 | +``` |
| 17 | + |
| 18 | +如果想要应用程序在GPU上执行命令(如渲染3D画面),就必须由CPU**将指令发送给GPU的驱动程序**。图形API是CPU与GPU进行交互的编程接口。 |
| 19 | + |
| 20 | +有许多这样的API,例如您可能听说过的OpenGL、DirectX、Vulkan以及Metal。 |
| 21 | + |
| 22 | +```{tip} |
| 23 | +理论上任何人都可以发明自己的图形API。每个GPU供应商都有自己的低级协议,用于驱动程序与硬件沟通,在此基础上实现了更常见的api(通常与驱动程序一起提供)。 |
| 24 | +``` |
| 25 | + |
| 26 | +本文档中,我们将学习一个名为WebGPU的图形API。它的设计目标是给GPU提供无关乎供应商和操作系统的**统一接口**。 |
| 27 | + |
| 28 | +```{figure} /images/rhi.png |
| 29 | +:align: center |
| 30 | +:class: with-shadow |
| 31 | +WebGPU是一个**渲染硬件接口**,建立在您平台的驱动程序/操作系统所提供的各种API之上。这些重复的开发工作将由浏览器完成一次,并通过他们的`webgpu.h`头文件提供给我们。 |
| 32 | +``` |
| 33 | + |
| 34 | +<!-- |
| 35 | + The different applications running on the computer are orchestrated in the CPU space, by the Operating System. |
| 36 | +
|
| 37 | + Some APIs are directly provided by the driver, some others are an extra programming layer (a .so or .dll shared library, or some C files that needs to be compiled with your application). |
| 38 | +--> |
| 39 | + |
| 40 | +为何是WebGPU? |
| 41 | +----------- |
| 42 | + |
| 43 | +> 🤔 对啊,我为什么要用一个**web API**来开发一个**桌面应用**呢? |
| 44 | +
|
| 45 | +很高兴你这么问,简单来说就是: |
| 46 | + |
| 47 | + - 合理的抽象层次 |
| 48 | + - 高性能 |
| 49 | + - 跨平台 |
| 50 | + - 足够标准化 |
| 51 | + - 不会过时 |
| 52 | + |
| 53 | +事实上这是唯一一个受益于所有这些属性的图形API! |
| 54 | + |
| 55 | +是的,WebGPU API主要是**为web设计**的,以作为JavaScript和GPU之间的接口。这**并不是缺点**,因为至今为止,web页面的性能需求已经与原生应用的需求相同。您可以在“[为什么我认为WebGPU是2023年最值得学习的图形API](appendices/teaching-native-graphics-in-2023.md)”中了解更多。 |
| 56 | + |
| 57 | +```{note} |
| 58 | +在为Web设计API时,**隐私性**和**可移植性**是两个重要的约束,我们**受益**于为可移植性所做的努力,且当使用WebGPU为原生应用进行开发时,出于隐私考虑而对API作出的限制可以被**禁用**。 |
| 59 | +``` |
| 60 | + |
| 61 | +又为何是C++? |
| 62 | +------------- |
| 63 | + |
| 64 | +作为WebGPU的初始目标,我们为何不用**JavaScript**?或是编写`webgpu.h`头文件所使用的**C语言**?亦或是**Rust**?毕竟是WebGPU的其中一个后端所使用的语言。这些都是可行的,但我选择了C++,原因如下: |
| 65 | + |
| 66 | + - C++仍然是用于高性能图形应用(视频游戏、渲染引擎、建模工具等)的主要语言。 |
| 67 | + - 一般来说,c++的抽象级别和控制非常适合与图形api交互。 |
| 68 | + - 图形编程对于真正学习C++来说是非常好的机会,在一开始,我将只假设对其有非常粗浅的了解。 |
| 69 | + |
| 70 | +```{seealso} |
| 71 | +对于Rust的等效文档,我建议您去看看Sotrh的[Learn WGPU](https://sotrh.github.io/learn-wgpu)。 |
| 72 | +``` |
| 73 | + |
| 74 | +如何使用此文档? |
| 75 | +------------------------------ |
| 76 | + |
| 77 | +### 阅读指南 |
| 78 | + |
| 79 | +本文档的前两部分被设计成顺序阅读,以作为一个完整地教程,同时,他的不同页面也可作为特定主题的提点。 |
| 80 | + |
| 81 | +[开始](getting-started/index.md)部分处理初始化WebGPU和窗口管理(使用GLFW)所需的样板文件,并介绍API的关键概念和习惯用法。在这一部分,我们将操作原始的C语言API,并在最后介绍本文档的其余部分所使用的c++包装器。 |
| 82 | + |
| 83 | +也可以**直接前往第二部分**的[基础3D渲染](basic-3d-rendering/index.md),并使用第1部分生成的样板代码作为入门工具包。您可以之后再回到开始部分确认细节。 |
| 84 | + |
| 85 | +如今,渲染远不是gpu的唯一用途;第3部分介绍了[基础计算](basic-compute/index.md),即WebGPU的非渲染使用。 |
| 86 | + |
| 87 | +第四部分是[进阶技术](advanced-techniques/index.md),重点介绍了各种计算机图形学技术,这些技术可以相互独立阅读。 |
| 88 | + |
| 89 | +### 文学化编程 |
| 90 | + |
| 91 | +```{warning} |
| 92 | +本文档尚处于早期阶段;它只适用于前面几章。 |
| 93 | +``` |
| 94 | + |
| 95 | +本文档遵循**文学化编程**:您所阅读的所有文档都有注释,这样您就可以**自动将其代码块组合**成完整的工作代码。这是一种确保文档包含**再现结果**所需的所有内容的方法。 |
| 96 | + |
| 97 | +在支持它的章节的右侧栏,您可以选择显示/隐藏这些信息: |
| 98 | + |
| 99 | +```{image} /images/literate-light.png |
| 100 | +:align: center |
| 101 | +:class: only-light |
| 102 | +``` |
| 103 | + |
| 104 | +```{image} /images/literate-dark.png |
| 105 | +:align: center |
| 106 | +:class: only-dark |
| 107 | +``` |
| 108 | + |
| 109 | +默认情况下,所有功能都是关闭的,以避免视觉混乱,您可以在您不知道在特定代码片段具体应包含在哪里时将其打开。 |
| 110 | + |
| 111 | +### 贡献 |
| 112 | + |
| 113 | +如果您遇到任何错别字或更严重的问题,您可以点击每个页面顶部的编辑按钮来修复它们! |
| 114 | + |
| 115 | +```{image} images/edit-light.png |
| 116 | +:alt: 使用每个页面顶部的编辑按钮! |
| 117 | +:class: only-light |
| 118 | +``` |
| 119 | + |
| 120 | +```{image} images/edit-dark.png |
| 121 | +:alt: 使用每个页面顶部的编辑按钮! |
| 122 | +:class: only-dark |
| 123 | +``` |
| 124 | + |
| 125 | +更普遍地说,您可以通过[储存库的issues](https://github.com/eliemichel/LearnWebGPU/issues)讨论任何技术或组织选择。欢迎任何建设性和/或善意的反馈! |
| 126 | + |
| 127 | +### 施工中 |
| 128 | + |
| 129 | +文档仍在构建,WebGPU亦是如此。我试图尽可能严格地遵循这些变化,但在API变得稳定之前总会导致轻微的不一致。 |
| 130 | + |
| 131 | +请务必留意最后一次修改页面和附加代码的日期(使用[git](https://github.com/eliemichel/LearnWebGPU))。它们可能不会完全同步;我通常先更新代码,再更新文档。 |
| 132 | + |
| 133 | +<!-- |
| 134 | + Cross-platform is not optional. It never really was, but since the global pandemic of 2020 it is even more important: students follow the lecture from a wide variety of devices and a teacher cannot rely on them using all the same machine from the university's lab room. |
| 135 | +--> |
0 commit comments