How-to-use-post-processing.html 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4. <meta charset="utf-8">
  5. <base href="../../../" />
  6. <script src="page.js"></script>
  7. <link type="text/css" rel="stylesheet" href="page.css" />
  8. </head>
  9. <body>
  10. <h1>How to use post-processing(後処理の使い方)</h1>
  11. <p>
  12. three.jsアプリケーションの多くは3Dオブジェクトをスクリーンに直接描画します。
  13. しかしながら時々、一つ以上のエフェクト(被写界深度、Bloom、フィルムグレイン、様々なアンチエイリアス効果など)を適用したい場合があります。こういったエフェクトを実装するためにpost-processingは広く使用されています。
  14. まず、シーンはビデオカードメモリのバッファを表す描画対象に対して描画されます。
  15. 次に、最終的なスクリーンへのレンダリングの前に、1つ以上のpost-processingで画像バッファにフィルタとエフェクトを適用します。
  16. </p>
  17. <p>
  18. こういったワークフローを実装するために、three.jsは[page:EffectComposer]で完全なpost-processingを提供しています。
  19. </p>
  20. <h2>Workflow</h2>
  21. <p>
  22. プロセスの一段階目はexampleディレクトリから必要なファイルを全てimportすることです。
  23. このガイドではthree.jsの[link:https://www.npmjs.com/package/three npm package](npmの公式のパッケージ)を使っていると想定しています。
  24. このガイドのデモでは下に示したファイルが必要です。
  25. </p>
  26. <code>
  27. import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js';
  28. import { RenderPass } from 'three/addons/postprocessing/RenderPass.js';
  29. import { GlitchPass } from 'three/addons/postprocessing/GlitchPass.js';
  30. import { OutputPass } from 'three/addons/postprocessing/OutputPass.js';
  31. </code>
  32. <p>
  33. 全てのファイルのimportが成功したのちに、[page:WebGLRenderer]のインスタンスを渡すことでcomposerを作成します。
  34. </p>
  35. <code>
  36. const composer = new EffectComposer( renderer );
  37. </code>
  38. <p>
  39. composerを使うときにはアプリケーションのアニメーションループを変更する必要があります。
  40. [page:WebGLRenderer]のrenderメソッドを呼ぶ代わりに[page:EffectComposer]のそれぞれの対応するものを使います。
  41. </p>
  42. <code>
  43. function animate() {
  44. requestAnimationFrame( animate );
  45. composer.render();
  46. }
  47. </code>
  48. <p>
  49. composerが準備できたので、post-processingパスのチェーンを設定できるようになりました。
  50. これらのパスはアプリケーションの最終的なビジュアルを出力することに責任を持ちます。
  51. これらのパスは追加/挿入の順番で処理されます。In our example, the instance of `RenderPass`
  52. is executed first, then the instance of `GlitchPass` and finally `OutputPass`。チェーンの中で最後の有効なpassが自動的に画面に描画されます。
  53. passの設定は以下のように行います。
  54. </p>
  55. <code>
  56. const renderPass = new RenderPass( scene, camera );
  57. composer.addPass( renderPass );
  58. const glitchPass = new GlitchPass();
  59. composer.addPass( glitchPass );
  60. const outputPass = new OutputPass();
  61. composer.addPass( outputPass );
  62. </code>
  63. <p>
  64. *RenderPass*は普通チェインのはじめにあります。
  65. これはレンダリングされたシーンを次のpost-processingの入力とするためです。
  66. *GlitchPass*は、これらのイメージをワイルドなglitch effectを適用するために使います。
  67. `OutputPass` is usually the last pass in the chain which performs sRGB color space conversion and optional tone mapping.
  68. 実際に動いているものを見るために、[link:https://threejs.org/examples/webgl_postprocessing_glitch sample]を見てみましょう。
  69. </p>
  70. <h2>Built-in Passes(組み込みのpass)</h2>
  71. <p>
  72. エンジンに元から入っている定義済みの後処理passが使えます。
  73. このpassは[link:https://github.com/mrdoob/three.js/tree/dev/examples/jsm/postprocessing postprocessing]ディレクトリに入っていて、広範囲に使用できます。
  74. </p>
  75. <h2>Custom Passes(カスタムpass)</h2>
  76. <p>
  77. 独自のpostprocessing shaderを書いて、post-processing passのチェーンの中に組み込みたい場合があります。そういった場合には、*ShaderPass*を利用することが出来ます。
  78. ファイルと独自のshaderをインポートしたのちに、以下のコードでpassを設定することができます。
  79. </p>
  80. <code>
  81. import { ShaderPass } from 'three/addons/postprocessing/ShaderPass.js';
  82. import { LuminosityShader } from 'three/addons/shaders/LuminosityShader.js';
  83. // later in your init routine
  84. const luminosityPass = new ShaderPass( LuminosityShader );
  85. composer.addPass( luminosityPass );
  86. </code>
  87. <p>
  88. リポジトリには[link:https://github.com/mrdoob/three.js/blob/master/examples/jsm/shaders/CopyShader.js CopyShader]と呼ばれるファイルがあり、カスタムshaderを作る上での良いスタートコードです。
  89. *CopyShader*はエフェクトを適用せずに、EffectComposerの読み込みバッファの画像内容を書き込みバッファにコピーするだけです。
  90. </p>
  91. </body>
  92. </html>