how-to-use-post-processing.html 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <!DOCTYPE html><html lang="zh"><head>
  2. <meta charset="utf-8">
  3. <title>如何使用后处理</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 - 如何使用后处理">
  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>如何使用后处理</h1>
  26. </div>
  27. <div class="lesson">
  28. <div class="lesson-main">
  29. <p>
  30. 许多 three.js 应用会把 3D 对象直接渲染到屏幕上。但在一些场景中,
  31. 你会希望叠加景深(DOF)、Bloom、胶片颗粒、抗锯齿等视觉效果。后处理(Post Processing)
  32. 是实现这些效果的常见方案:先把场景渲染到一个渲染目标(显存中的图像缓冲区),
  33. 再通过一个或多个后处理 pass 对该缓冲区应用滤镜与效果,最后输出到屏幕。
  34. </p>
  35. <p>
  36. three.js 通过 `EffectComposer` 提供了完整的后处理工作流支持。
  37. </p>
  38. <h2>工作流程</h2>
  39. <p>
  40. 第一步是从 examples 目录导入所需模块。本文默认你使用 three.js 官方
  41. [link:https://www.npmjs.com/package/three npm 包]。在本教程的基础示例中,我们需要以下文件。
  42. </p>
  43. <pre class="prettyprint notranslate lang-js" translate="no">
  44. import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js';
  45. import { RenderPass } from 'three/addons/postprocessing/RenderPass.js';
  46. import { GlitchPass } from 'three/addons/postprocessing/GlitchPass.js';
  47. import { OutputPass } from 'three/addons/postprocessing/OutputPass.js';
  48. </pre>
  49. <p>
  50. 导入完成后,把 `WebGLRenderer` 实例传入,创建 composer。
  51. </p>
  52. <pre class="prettyprint notranslate lang-js" translate="no">
  53. const composer = new EffectComposer( renderer );
  54. </pre>
  55. <p>
  56. 使用 composer 后,需要调整动画循环:不再调用 `WebGLRenderer.render()`,
  57. 而改为调用 `EffectComposer.render()`。
  58. </p>
  59. <pre class="prettyprint notranslate lang-js" translate="no">
  60. function animate() {
  61. requestAnimationFrame( animate );
  62. composer.render();
  63. }
  64. </pre>
  65. <p>
  66. 到这里 composer 已准备就绪,可以配置后处理 pass 链。各 pass 按添加顺序依次执行,
  67. 共同决定最终输出结果。在本例中先执行 `RenderPass`,再执行 `GlitchPass`,
  68. 最后执行 `OutputPass`。链路中最后一个启用的 pass 会自动渲染到屏幕。
  69. 配置如下:
  70. </p>
  71. <pre class="prettyprint notranslate lang-js" translate="no">
  72. const renderPass = new RenderPass( scene, camera );
  73. composer.addPass( renderPass );
  74. const glitchPass = new GlitchPass();
  75. composer.addPass( glitchPass );
  76. const outputPass = new OutputPass();
  77. composer.addPass( outputPass );
  78. </pre>
  79. <p>
  80. `RenderPass` 通常放在链路开头,用于提供场景渲染结果给后续步骤。
  81. 本例中 `GlitchPass` 会基于图像数据施加故障效果。
  82. `OutputPass` 一般放在最后,负责 sRGB 色彩空间转换与色调映射(tone mapping)。
  83. 可参考这个 [link:https://threejs.org/examples/webgl_postprocessing_glitch 在线示例]。
  84. </p>
  85. <h2>内置 Pass</h2>
  86. <p>
  87. 引擎提供了大量预置后处理 pass,可在
  88. [link:https://github.com/mrdoob/three.js/tree/dev/examples/jsm/postprocessing postprocessing]
  89. 目录中找到。
  90. </p>
  91. <h2>自定义 Pass</h2>
  92. <p>
  93. 如果你要编写自定义后处理着色器并接入 pass 链,可以使用 `ShaderPass`。
  94. 在导入相关模块和自定义 shader 后,按下述方式添加 pass:
  95. </p>
  96. <pre class="prettyprint notranslate lang-js" translate="no">
  97. import { ShaderPass } from 'three/addons/postprocessing/ShaderPass.js';
  98. import { LuminosityShader } from 'three/addons/shaders/LuminosityShader.js';
  99. // 稍后在你的初始化流程中
  100. const luminosityPass = new ShaderPass( LuminosityShader );
  101. composer.addPass( luminosityPass );
  102. </pre>
  103. <p>
  104. 仓库中提供的
  105. [link:https://github.com/mrdoob/three.js/blob/master/examples/jsm/shaders/CopyShader.js CopyShader]
  106. 是编写自定义 shader 的良好起点。`CopyShader` 仅将 `EffectComposer` 的读缓冲内容
  107. 复制到写缓冲,不附加任何效果。
  108. </p>
  109. </div>
  110. </div>
  111. </div>
  112. <script src="../resources/prettify.js"></script>
  113. <script src="../resources/lesson.js"></script>
  114. </body></html>
粤ICP备19079148号