uetokyo / UnrealVRM

A VRM (VR Avator 3D Format) Support Project for Unreal Engine
MIT License
35 stars 3 forks source link

How to port MToon Shader to UE4(VRMの標準トゥーンシェーダー「MToon」の移植方針) #2

Open emadurandal opened 6 years ago

emadurandal commented 6 years ago

UE4でのVRMサポートにあたって、VRMの標準実装であるUniVRMが依存しているMToon(MToonはVRM仕様において、標準のトゥーンシェーダーという扱いです)を、UE4に移植する必要があります。

このMToonシェーダーですが、UnityのForwardレンダリングパイプラインの仕様に寄りそった設計実装になっています。

UnityのFowardレンダリングは、ライティングがBaseパスとAddパスに分かれており、MToonシェーダーもそれぞれのパス用のシェーダが用意されています。 https://docs.unity3d.com/ja/current/Manual/RenderTech-ForwardRendering.html

マルチ光源下でのライティングパス設計がUnityとUE4では異なるため、特にこのAddパスのライティング寄与をどうするか、というところで、一度MToon開発者のSantarhさんと話し合ったことがあります。

そこで話題に出た選択肢としては、以下の二つでした。 A. Addパスは切り捨てる(これはできればやりたくない) B. Addパスの寄与を想定範囲内に正規化し、同様の仕組みをUE4でも作って、できる限り光の計算量を両エンジンで近づける。

Bについては、以下のようなイメージです。

UnityのMToonシェーダーのライティング計算の寄与は大まかに以下の式で表せるはず。

intensity of Model = BASE(メインライトとSHの絡み) + ADD1 + ADD2 + ... + ADDn

そこで、光の寄与要素を以下の3つに分類する。

・「メインライト」
・「環境光(UnityでのSH)」
・「副ライト群の合計寄与」(Unityでの「ADD1~ADDn」)

その上で、以下を行う。

・この3つの割合(計算上の寄与)をユーザーが指定できるようにしてしまう。
・ADDパスのライト個数nがあらかじめわかっていれば、それぞれのADDパスの出力をnで割っておけば副ライト群の寄与を想定範囲に正規化できる。
・UE4でも、ライティング環境から「メインライト」と「環境光」と「副ライト群」相当の寄与を算出できる(……はず多分)。そして、この3要素にUnity版と同じ扱いの処理をすればいい。
・シーン全体の明るさに合わせるため、「3つの寄与合計」に対して「シーンの平均輝度」でスケールなどを行う。

ただし、現状のMToonは上記のような実装にはなっていません(開発者のSantarhさんも一度は考えられたそうなのですが、標準実装として処理にC#スクリプトが必要になるのは手軽さという観点であまり好ましくない、との理由から見送ったそうです)。

もっとも、上のような形(またはその他の形)に、こちらサイドの都合で仕様を変えていただけるかは正直わかりません。しかし、いずれにせよMToonの移植に当たっては、Santarhさんらドワンゴ社の方達との連携を行いながら進めるのが望ましいと考えています。

alwei commented 6 years ago

個人的にはこれをUniVRMに合わせて用意する必要はないと思っています。

UE4でのトゥーンシェーダーの実装は多岐に渡り、どれもメリットデメリットがあります。 シェーダーレベルでの互換性維持は同じレンダリングパスやシステムを持っていない限りは非現実的なところがあり、ひとまずは簡単な実装でもいいので提供ができればなと。

これはUnity以外の全てのエンジンや環境でも同様ですし、各々でよりいい表現を提供できればいいのではないかと。

emadurandal commented 6 years ago

なるほど、確かに費用対効果があまり良くないかもしれませんね。

懸念していたのは、現状皆LookDev(ライティング品質チェック)をUnityで当然行うわけなので、それをUE4で読み込んだ場合に、変に暗かったり明るすぎたり、意図通りにならなすぎて、不満が出てしまうことでした。 できれば大きな不満が出ない程度に、ある程度揃えるくらいはできると良さそうですが、最初に突き詰める部分ではないかもしれませんね。

各々でよりいい表現を提供できればいいのではないかと。

それが運用として受け入れられるのなら、ベストですね。