webgpurenderer.html 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <!DOCTYPE html><html lang="zh"><head>
  2. <meta charset="utf-8">
  3. <title>WebGPU 渲染器</title>
  4. <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
  5. <meta name="twitter:card" content="summary_large_image">
  6. <meta name="twitter:site" content="@threejs">
  7. <meta name="twitter:title" content="Three.js - WebGPU 渲染器">
  8. <meta property="og:image" content="https://threejs.org/files/share.png">
  9. <link rel="shortcut icon" href="../../files/favicon_white.ico" media="(prefers-color-scheme: dark)">
  10. <link rel="shortcut icon" href="../../files/favicon.ico" media="(prefers-color-scheme: light)">
  11. <link rel="stylesheet" href="../resources/lesson.css">
  12. <link rel="stylesheet" href="../resources/lang.css">
  13. <link rel="stylesheet" href="/manual/zh/lang.css">
  14. <script type="importmap">
  15. {
  16. "imports": {
  17. "three": "../../build/three.module.js"
  18. }
  19. }
  20. </script>
  21. </head>
  22. <body>
  23. <div class="container">
  24. <div class="lesson-title">
  25. <h1>WebGPU 渲染器</h1>
  26. </div>
  27. <div class="lesson">
  28. <div class="lesson-main">
  29. <p>
  30. `WebGPURenderer` 是 three.js 的下一代渲染器。本文会简要介绍它的能力和基本使用方式。
  31. </p>
  32. <h2>概述</h2>
  33. <p>
  34. `WebGPURenderer` 被设计为 `WebGLRenderer` 的现代替代方案。
  35. 它优先使用 WebGPU(现代高性能图形与计算 API),
  36. 同时也被设计成通用渲染器:若设备/浏览器不支持 WebGPU,
  37. 会自动回退到 WebGL 2 后端。
  38. </p>
  39. <p>
  40. 这个回退机制非常关键:应用可以在支持 WebGPU 的平台获得新能力,
  41. 同时不牺牲仅支持 WebGL 2 设备的兼容性。
  42. </p>
  43. <p>
  44. 除了接入 WebGPU,`WebGPURenderer` 还提供了以下特性:
  45. <p>
  46. <ul>
  47. <li>
  48. 内置全新的节点材质系统,开发自定义材质更灵活、更稳健。
  49. </li>
  50. <li>
  51. 支持 three.js 着色语言 TSL。你可以用 JavaScript 以跨平台方式编写 shader,
  52. 并根据后端自动转译为 WGSL 或 GLSL。
  53. </li>
  54. <li>
  55. 内置全新后处理栈,支持 MRT(多渲染目标)并可借助节点系统自动合并 pass。
  56. </li>
  57. </ul>
  58. 下面看看如何在 three.js 应用中集成 `WebGPURenderer`。
  59. <h2>使用方式</h2>
  60. <p>
  61. `WebGPURenderer` 使用不同构建入口,因此导入方式需要调整:
  62. </p>
  63. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">
  64. - import * as THREE from 'three';
  65. + import * as THREE from 'three/webgpu';
  66. </pre>
  67. <p>
  68. 如果你使用 import map,建议改成如下形式(路径按你的工程结构调整):
  69. </p>
  70. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">
  71. &lt;script type="importmap"&gt;
  72. {
  73. "imports": {
  74. "three": "../build/three.webgpu.js",
  75. "three/webgpu": "../build/three.webgpu.js",
  76. "three/tsl": "../build/three.tsl.js",
  77. "three/addons/": "./jsm/"
  78. }
  79. }
  80. &lt;/script&gt;
  81. </pre>
  82. <p>
  83. 创建渲染器实例的方式和 `WebGLRenderer` 类似:
  84. </p>
  85. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">
  86. const renderer = new THREE.WebGPURenderer( { antialias: true } );
  87. renderer.setPixelRatio( window.devicePixelRatio );
  88. renderer.setSize( window.innerWidth, window.innerHeight );
  89. renderer.setAnimationLoop( render );
  90. document.body.appendChild( renderer.domElement );
  91. </pre>
  92. <p>
  93. 需要注意,WebGPU 初始化是异步的。因此推荐使用 `setAnimationLoop()`,
  94. 它能确保首次渲染前完成初始化。
  95. 如果你坚持使用 `window.requestAnimationFrame()` 或需要在初始化阶段直接使用渲染器,
  96. 则要额外调用一行初始化代码。
  97. </p>
  98. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">
  99. const renderer = new THREE.WebGPURenderer( { antialias: true } );
  100. renderer.setPixelRatio( window.devicePixelRatio );
  101. renderer.setSize( window.innerWidth, window.innerHeight );
  102. renderer.setAnimationLoop( render );
  103. document.body.appendChild( renderer.domElement );
  104. + await renderer.init();
  105. </pre>
  106. <p>
  107. `WebGLRenderer` 中常见的方法(如 `clear()`、`setRenderTarget()`、`dispose()`)
  108. 在 `WebGPURenderer` 中同样可用。完整接口请参考
  109. <a href="https://threejs.org/docs/#Renderer" target="_blank">API 文档</a>。
  110. </p>
  111. <p>
  112. 正如前文所述,`WebGPURenderer` 默认使用 WebGPU,必要时回退 WebGL 2。
  113. 如果你想在测试中强制 WebGL 2,或出于某些原因禁用 WebGPU,
  114. 可以使用 `forceWebGL` 参数。
  115. </p>
  116. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">
  117. - const renderer = new THREE.WebGPURenderer( { antialias: true } );
  118. + const renderer = new THREE.WebGPURenderer( { antialias: true, forceWebGL: true } );
  119. </pre>
  120. <h2>迁移说明</h2>
  121. <p>
  122. 准备迁移到 `WebGPURenderer` 时,需要注意以下几点:
  123. </p>
  124. <ul>
  125. <li>
  126. `ShaderMaterial`、`RawShaderMaterial` 以及通过 `onBeforeCompile()` 改造内置材质,
  127. 在 `WebGPURenderer` 中不受支持。相关逻辑需要迁移到节点材质与 TSL。
  128. </li>
  129. <li>
  130. `EffectComposer` 及其传统 pass 在这里不支持,
  131. 因为 `WebGPURenderer` 提供了新一代后处理栈。
  132. 类似材质迁移,后处理效果也使用 TSL 编写,并以节点组合表达。
  133. 常用效果已迁移并提供了性能更好的节点版本,同时新增了 SSGI、SSS、
  134. 更好的 DoF 等新效果。可查看
  135. <a href="https://threejs.org/examples/?q=webgpu%20postprocessing" target="_blank">官方示例</a>。
  136. </li>
  137. <li>
  138. 渲染器整体仍属于实验阶段,尽管成熟度近年已明显提升。
  139. 依据你的应用和场景,仍可能遇到缺失特性,或在某些场景下 `WebGLRenderer` 更快。
  140. 如遇问题建议在 GitHub 提 issue。`WebGPURenderer` 会持续迭代,
  141. 建议尽量使用最新版本。
  142. </li>
  143. </ul>
  144. <h2>WebGLRenderer 的现状</h2>
  145. <p>虽然当前研发重点在 `WebGPURenderer`、节点材质和 TSL,
  146. `WebGLRenderer` 仍在维护,且依然是纯 WebGL 2 应用的推荐选择。
  147. 但请注意,项目已不计划为 `WebGLRenderer` 增加大型新特性,这一点从最近的版本说明(release notes)中也可以明显看出。
  148. 同时我们也在评估为其加入有限的节点材质支持,
  149. 以便某些项目更平滑地迁移到 `WebGPURenderer`。
  150. </p>
  151. </div>
  152. </div>
  153. </div>
  154. <script src="../resources/prettify.js"></script>
  155. <script src="../resources/lesson.js"></script>
  156. </body>
  157. </html>
粤ICP备19079148号