Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20191120_ThreeJSTokyo

 20191120_ThreeJSTokyo

E92a60860389268963373b8dd6409926?s=128

Yutaka Obuchi

November 20, 2019
Tweet

Transcript

  1. pixiv Inc. OBUCHI Yutaka 2019.11.20

  2. 2 FMS_Catです

  3. 3 Yutaka “FMS_Cat” Obuchi 趣味 WebGLやさんです

  4. OBUCHI Yutaka (FMS_Cat) ピクシブ株式会社で やってます Three.js Unity

  5. OBUCHI Yutaka (FMS_Cat) さんと やってます

  6. のはなし

  7. VRMっていう3Dアバターフォーマットを Three.jsで使えるようにしました @pixiv/three-vrm

  8. VRoid Hubという3Dアバター共有ハブの プロダクトで必要だった

  9. 技術背景 VRM: 3Dキャラクター表現に特化した 3Dモデルフォーマット https://vrm.dev/

  10. 技術背景 VRMはglTFの拡張機能として定義されている https://raw.githubusercontent.com/KhronosGroup/glTF /master/specification/2.0/figures/gltfOverview-2.0.0b.png

  11. 技術背景 Humanoid インタフェース 表情制御のための ブレンドシェイプ トゥーン マテリアル 一人称視点用の フィールド 揺れもの

    フィールド・実装 メタ情報 ライセンスなど
  12. 技術背景 - glTFの実装 - VRM拡張の実装 全部イチからやるのは工数デカすぎ……

  13. 技術背景 WebGLライブラリ 有名・簡単・アクティブ https://threejs.org/

  14. 技術背景 GLTFLoaderもある https://threejs.org/examples/?q=gltf#webgl_loader_gltf

  15. 技術背景 GLTFLoaderでVRMを見てみる https://gltf-viewer.donmccurdy.com/ 魅力が ぜんぜん 違う!

  16. アーティストが表現したいものを 確実にユーザーに届けるには VRMの漏れない実装は不可欠 技術背景

  17. なかでもマテリアルの実装 技術背景 Unlit(ライティングなし) MToon

  18. Materials (MToon) MToonマテリアル - VRMが標準でサポートするトゥーンマテリアル - 最低限で効果的なライティング表現 - セル調・イラスト調など幅広いトゥーン表現 -

    MatCapによる擬似的なスペキュラ表現 - アウトラインによる線画風表現
  19. Materials (MToon) Unlit(ライティングなし) MToon

  20. Materials (MToon) Unlit(ライティングなし) MToon

  21. Materials (MToon) Unlit(ライティングなし) MToon

  22. Materials (MToon) How to make your own material on Three.js

  23. Materials (MToon) How to make your own material on Three.js

    1, /src/renderers/shaders/ShaderLibから テンプレートとなるマテリアルを探す https://github.com/mrdoob/three.js/tree/dev/src/renderers/shaders/ShaderLib
  24. Materials (MToon) How to make your own material on Three.js

    2, シェーダ完全理解する https://github.com/mrdoob/three.js /blob/dev/src/renderers/shaders/ShaderLib/meshphong_frag.glsl.js #include !!? https://github.com/mrdoob/three.js /blob/dev/src/renderers/webgl/WebGLProgram.js
  25. Materials (MToon) How to make your own material on Three.js

    2, シェーダ完全理解する #include !!? https://github.com/mrdoob/three.js /blob/dev/src/renderers/webgl/WebGLProgram.js https://github.com/mrdoob/three.js /blob/dev/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js
  26. Materials (MToon) How to make your own material on Three.js

    2, シェーダ完全理解する https://github.com/mrdoob/three.js /blob/dev/src/renderers/shaders/ShaderLib/meshphong_frag.glsl.js #include !!? https://github.com/mrdoob/three.js /blob/dev/src/renderers/webgl/WebGLProgram.js #include が展開されると トータル854行 + ランタイム時注入113行
  27. Materials (MToon) How to make your own material on Three.js

    3, 実装していく
  28. https://github.com/mrdoob/three.js /blob/dev/src/renderers/shaders/ShaderLib/meshphong_frag.glsl.js Materials (MToon) ライティング

  29. Materials (MToon) https://github.com/mrdoob/three.js /blob/dev/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js ライトごと RE = レンダリング方程式

  30. Materials (MToon) https://github.com/mrdoob/three.js /blob/dev/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js dot!!

  31. Materials (MToon) アウトラインの実装に最も時間を要した

  32. Materials (MToon) ジオメトリを法線方向に膨らませ カリングを裏返しにする(裏だけ描画) 二度の描画が必要

  33. Materials (MToon) Unityは1シェーダ内で 複数パスを定義可能だが、 Three.jsでは不可能 (= 1シェーダ1パス) 通常のシェーディング アウトライン

  34. Materials (MToon) マルチマテリアルの仕組みをハックした https://threejs.org/docs/#api/en/core/BufferGeometry

  35. Materials (MToon) Three.jsのデータ構造(ざっくり) Mesh (Object3D) Material 0 Material 1 Material

    2 Geometry VBO/IBO Group 0 Group 2 Group 1
  36. Materials (MToon) Mesh (Object3D) Material: 肌 Material: 上着 Material: スカート

    Geometry VBO/IBO Group: 肌 Group: スカート Group: 上着 Material: 肌Outline Group: 肌Outline
  37. Materials (MToon)

  38. MToonMaterial そんな@pixiv/three-vrmの MToonマテリアルですが Three.jsはカスタムマテリアルを クラスにするのがチョー面倒 本題

  39. MToonMaterial THREE.ShaderMaterialを継承して MToonMaterialを定義します

  40. MToonMaterial fogとかlightsとかを有効化するコード 忘れると ”なんか動かない……” になりがち

  41. MToonMaterial Uniformをいろいろ 生み出すコード

  42. MToonMaterial テクスチャごとのフォーマットを 定義するコードをGLSLに入れる

  43. MToonMaterial いくつかの map などのメンバは Three.jsのパイプラインにより利用される

  44. MToonMaterial いくつかの map などのメンバは Three.jsのパイプラインにより利用される https://github.com/mrdoob/three.js/blob/master /src/renderers/WebGLRenderer.js https://github.com/mrdoob/three.js/blob/master /src/renderers/shaders/ShaderChunk/map_fragment.glsl.js

  45. MToonMaterial でも結局MToonのあらゆる機能を Three.jsにあてがおうとすると シェーダで再定義が必要 uvスクロールをしたいのでvUvでは不十分

  46. MToonMaterial ここまでやっても VRMからMToonのパラメタを デシリアライズするのはまだ面倒く (MToonMaterialを独立したマテリアルとして 使えるようVRM仕様とガチガチにはしていない)

  47. MToonMaterial MToonのプロパティ名から 命名フォーマットを変えるコード (e.g. _SphereAdd → sphereAdd )

  48. MToonMaterial 前述したとおり アウトライン向けに2つ目のMToonMaterialを生成

  49. MToonMaterial そしてグループにする

  50. MToonMaterial 感情 苦しいです あまりマテリアルをモジュールとすることが Three.jsでは考えられていなさそう

  51. MToonMaterial 期待: NodeMaterial NodeMaterial https://twitter.com/mrdoob/status/667765526131826688

  52. MToonMaterial マテリアルが可搬な世界観に到達できるのは いつになるのだろうか……

  53. MToonMaterial より良い実装のイメージがある方 他のマテリアルモジュールの実装を知っている方 その他、VRM・MToonに興味がある方 助けて https://github.com/pixiv/three-vrm/

  54. そんな ですが

  55. メンテナンスできる人が ぜんぜんいない (社内ではほぼ   のみ)

  56. 採用してます - WebGLやUnityで キャラクターをめっちゃ魅力的に見せたい方 - VRMの仕様まで踏み込んで3Dキャラクターの 世界をもっと明るくしたい方 ピクシブです

  57. None