Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ポストフィルタ論

4,218 views

Published on

2017/11/2に講演したポストフィルタに関するスライドです。
講演者:株式会社ロジカルビート・堂前嘉樹

Published in: Engineering
  • Be the first to comment

ポストフィルタ論

  1. 1. ポストフィルタ論 株式会社ロジカルビート 代表取締役 / 堂前 嘉樹
  2. 2. 自己紹介
  3. 3. 自己紹介 株式会社ロジカルビートの代表取締役・プログラマー。 2016年5月に法人設立。新横浜にあります。 ゲームプログラミング系の会社です。 スタッフ数6名。(2017/10) 個人としてはグラフィック系のプログラムが主戦場。 関連作は「いけにえと雪のセツナ」(スクウェア・エニックス)など。 書籍に「ゲームを動かす技術と発想」「ゲームを動かす数学・物 理」がある。
  4. 4. 本日のテーマ
  5. 5. 今回は ポストフィルタについて
  6. 6. ポストフィルタがテーマ 今回はポストフィルタについて話を進めます。 「イメージエフェクト」「ポストエフェクト」など呼び名がたくさんありま すが、「ポストフィルタ」で進めます。 3Dで描画したものを画像加工して、絵に様々な効果を加える 処理のことを指します。 2Dベースで処理。 Photoshopの「フィルタ」みたいなものだと思ってください。
  7. 7. Unityでの 簡単な使い方
  8. 8. 少し前までのImage Effects導入方法
  9. 9. 最近のImage Effects導入方法(2017から?)
  10. 10. Unityでの簡単な使い方 Unityにはいくつかポストフィルタが用意されています。 プロジェクトへの追加は容易。 Cameraに各ポストフィルタを追加することによって、簡単に利 用することが出来ます。 最近ではPost Processing Stackというのもあるらしいです。 触ったことなく未検証です。。。
  11. 11. 中身を 見てみよう!
  12. 12. void OnRenderImage (RenderTexture source, RenderTexture destination)
  13. 13. https://docs.unity3d.com/ja/current/Manual/ExecutionOrder.html
  14. 14. OnRenderImage Camera内の通常の描画
  15. 15. Unityでの処理のされ方 サンプルとしてBloomのスクリプトを見てみます。 OnRenderImageでフックを掛けてCameraに対する絵をもらい、 その中で加工する流れ。 イベント関数順でも描画後を意味する。 Cameraにコンポーネントを着けるのは自然の流れ。
  16. 16. もう少し 詳しく見る
  17. 17. Temp (一時バッファ) Default Target (表示バッファ) テクスチャとして利用!
  18. 18. Unityでの描画処理 今回はColor Correction Curvesを例に取ります。 Cameraに映る3Dオブジェクトを一時的なRender Textureに描 画し、それをテクスチャとして、Default Targetに描く。 CameraのTarget Textureの項目がNoneの場合、通常はDefault Targetに描画するが、OnRenderImageを含むコンポーネント(ポ ストフィルタ)がある場合は内部的に一時バッファを利用する模様。
  19. 19. 非常にシンプル!
  20. 20. ただし 注意点がひとつ
  21. 21. 高負荷に なりやすい!!
  22. 22. 理由その1 フルカラーフォーマット 主体
  23. 23. Temp (一時バッファ) Default Target (表示バッファ) テクスチャとして利用! ARGB32
  24. 24. 理由その2 参照&描画ピクセル 数が多い
  25. 25. 1280 720
  26. 26. Temp (一時バッファ) Default Target (表示バッファ) テクスチャとして利用! 1280×720 1280×720
  27. 27. いくつか重ねると 負荷も高くなる
  28. 28. ポストフィルタの負荷 ポストフィルタは総じてGPU負荷が高くなる! CPU負荷はそんなにかからない。ピクセル負荷高し。 描いた画像をテクスチャとして利用するので、必然的にフルカ ラー形式のテクスチャを扱うことになる。 モデルでは圧縮テクスチャを使えるが、そういうわけにいかない。 しかもサイズが大きい! フレームの10%〜20%くらいは取られると考える。
  29. 29. 対策
  30. 30. 高負荷なピクセル描画を 少なくする
  31. 31. ぼかし処理 縮小コピー 合成
  32. 32. 4→2に変更してみる
  33. 33. ぼかし処理 縮小コピー 合成
  34. 34. パラメータが 描画回数に関わる こともある
  35. 35. 縮小コピー ぼかし
  36. 36. わざわざ 縮小コピーを 挟むのは何故?
  37. 37. ぼかし 複数回テクスチャを参照する (1ピクセル描くのに4回参照) 大きいテクスチャを参照すると 高負荷になりがち!
  38. 38. 縮小コピー ぼかし コピーは1ピクセルで テクスチャを1回参照するだけ 4回参照するが、 小さいテクスチャから読み取っ ているのでマシ
  39. 39. 描画回数とピクセルの質 ポストフィルタを軽くする単純な指標として、描画回数を減らす というのが挙げられる。 非常にわかりやすい。 しかし、負荷を下げるためにあえて単純コピーなどを行う方が いい場合もある。 大きいテクスチャから読み取ると(テクスチャキャッシュの関係か ら)遅くなるので。 絵的な質も上がることがある。
  40. 40. ブルーム カラーコレクション
  41. 41. Temp Temp Temp Default Target ぼかし作成 ブルーム合成 カラーコレク ション加工
  42. 42. 描画を 減らせないか?
  43. 43. Temp Temp Temp Default Target ぼかし作成 ブルーム合成 カラーコレク ション加工
  44. 44. Temp Temp Temp Default Target ぼかし作成 ブルーム合成 & カラーコレク ション加工
  45. 45. 処理を統合する スクリプト&シェーダを 自作する!!
  46. 46. 処理の統合 複数のポストフィルタを掛け合わせると、無駄が生じやすい。 標準のものだとコンポーネントが分かれているため。 頑張っているとは思うが・・・。 とことん突き詰めると、ポストフィルタを自作するという選択肢も 考えなければならない。 用意されているものを使うよりもある意味、管理はしやすい。
  47. 47. もう少し こだわってみる
  48. 48. Temp (一時バッファ) Default Target (表示バッファ) テクスチャとして利用! 1280×7201280×720 1280×720 3D部分は 解像度を減らしたい!
  49. 49. RenderTexture (自前で用意) Default Target (表示バッファ) テクスチャとして利用! 960x540960x540 1280×720 OnPostRenderで処理!! (OnRenderImageはクセがある)
  50. 50. 更に突き詰める OnRenderImageを利用すると手軽だが、内部でどう処理され ているか把握しづらい。 弊社ブログを参照:http://logicalbeat.jp/blog/601/ RenderTextureを自前管理する必要があるが、 OnPostRenderで処理する方が柔軟性が高くなるので、個人的 に強くオススメします。
  51. 51. 第2部 ピクセルを突き詰める
  52. 52. バイリニア (Bilinear)
  53. 53. キチンと 理解していますか?
  54. 54. ( x, y ) ( x+1, y ) ( x+1, y+1 )( x, y+1 ) A B C D ( a, b )
  55. 55. ( x, y ) ( x+1, y ) ( x+1, y+1 )( x, y+1 ) A B C D ( a, b ) R = lerp( lerp(A,B,a-x), lerp(C,D,a-x), b-y ) ※lerp(a,b,c) : c=0ならaになり、c=1ならbになる関数
  56. 56. ( x, y ) ( x+1, y ) ( x+1, y+1 )( x, y+1 ) A B C D
  57. 57. 各カラーから1/4ずつもらう (4カラーの平均になる)
  58. 58. バイリニア(Bilinear)の復習 テクスチャを参照する時の、一番シンプルなカラーの補間方法。 参照するポイントの近接4ピクセルを探り、その距離から線形補 間でカラーを算出する。 参照点がピクセルの中央だった場合はそのカラーになる。 参照点が4ピクセルの中心だった場合は、各カラーから4等分した カラーが与えられる。(平均になる)
  59. 59. バッファコピー
  60. 60. 絵を別のバッファに 描き移すことがある
  61. 61. 等倍コピー
  62. 62. Texture Render Target そのままコピーされる!
  63. 63. 縦横が1/2のバッファにコピー
  64. 64. Texture Render Target カラーの平均値としてコピー
  65. 65. 縦横が1/4のバッファにコピー
  66. 66. Texture Render Target カラーの欠損が発生してしまう
  67. 67. 速いが画質にムラが出る 綺麗だが手間がかかる
  68. 68. バッファコピーとバイリニア ポストフィルタではバッファをコピーするのが基本処理となる。 その際、同サイズのこともあれば縮小コピーなどもある。 コピーの際、どのピクセルを取ってきているかというのをきちん と理解しておくと良い。 更にバイリニアがどう活きてくるか? 情報欠損を看過しても速度を取るか、それとも綺麗な絵を出す か?
  69. 69. ガウシアンフィルタ
  70. 70. 縮小コピー ぼかし
  71. 71. ここをぼかしたい!
  72. 72. 1 16 1 16 1 16 1 16 2 16 2 16 2 16 2 16 4 16
  73. 73. 9点サンプリングすると重い!!
  74. 74. 1 4 1 4 1 4 1 4
  75. 75. 4点サンプリングして4で割ればOK!!
  76. 76. ガウシアンフィルタ ぼかし画像を作成するのに手軽なフィルタ。 自分自身のピクセルの比重を高く、山型になるように周辺も加 えて平均をとる手法。 3×3で行うのが手軽でよく使われる。 とは言え、テクスチャを9点サンプリングすると重い!! バイリニアの特性を活かし、4点で済むようにする。 この考え方は他でも活かせる。
  77. 77. ピクセルの距離
  78. 78. 1280×720の画像に対してブルームを掛けた様子
  79. 79. 320×180(縦横1/4ずつ)の画像に対してブルームを掛けた様子
  80. 80. Texture (1/1) Texture (1/4) 「1ピクセル」で考えると広がってしまう!!
  81. 81. Texture (1/1) Texture (1/4) 理想解像度を想定してサンプリング
  82. 82. ピクセルの距離の考慮 レンダーターゲットやテクスチャのサイズが異なると、「1ピクセ ル」の距離も変わってくる。 端末差(スマホ)、動的解像度などが要因。 ブルームやDOFで影響が出てくる。 理想の解像度を設定した上で、それを考慮したサンプリングを しておくと良い。 シェーダ内で係数を持って処理すると良い。 気にしない、気にならないならやらなくても良い。
  83. 83. まとめ
  84. 84. まとめ Unityを使ったポストフィルタを眺めてみました。 ポストフィルタの大まかな流れを把握しておく。 3D描画した後の画像を加工するという考え。 一時バッファも活用される。 ポストフィルタは重いということを理解する。 理由は様々ある。 軽くするための工夫をひねり出す。
  85. 85. まとめ ピクセル単位の処理も気にしてみましょう。 改めて、バイリニアについて理解を深める。 なぁなぁで作ってしまわない。(ズレたりする) 1ピクセルにまで神経を尖らせるつもりで!!
  86. 86. ありがとう ございました

×