みくだん

MMDにおけるSSAO

2013/11/24
MMD技術 0
※このエントリは中途半端な知識と理解によって書かれています。情報の正誤などは他ソースなどと比較して自己責任にてお読み頂ければと思います。

 MMDにおいてSSAOを使用している方は多いと思いますが、その効果や仕組みを(ある程度でも)理解しながら使われている人はまだ少数かもしれない、と思い至り、記事にしてみます。
 技術的内容になり、少々眠い内容かもしれませんが……。
 これまた、前提となる知識がある程度必要となります。

■ AOとは

 SSAOのAOは「アンビエントオクルージョン」、直訳すると『周辺光の閉塞』とでもいいましょうか。
 簡単に説明するとデコボコがある凹み部分の光の反射の仕方、もしくは影の出方を計算する方法の一つです。
 光源から光の筋を計算、屈折・透過処理などを順次行う単純なレイトレーシングでは、なかなか光が入り込まない部分の計算は非常に重く、うまく表現しにくく、複雑な凸凹がある物体などはどうしても影の柔らかさが作れませんでした。
 AOではより高速かつ綺麗に影を作る方法だと思って頂いて大丈夫かと思います。

 AOの技術的な内容、またスクリーンショットなどはこちらが参考になるでしょう。

CINEMA 4Dトレーニングサイト
http://c4d-training.jp/?p=483



■ SSAOとは

 SSAOとは、AOの簡易版です。AOそのものは高速といえどもリアルタイム処理ができる程軽くはありません。
 SSAOは「スクリーンスペース・アンビエントオクルージョン」の略です。
 先ほどのCINEMA4Dのサイトをご一読すれば分かりますが、AO設定自体はマテリアル、MMDで言うところの材質に設定するものです。
 MMDにおけるSSAOはポストプロセスエフェクトです。つまり、一度全ての形状をレンダリングしてからの処理となります。
 一度、画面を作成してからAOを掛ける方式です。この方法だとかなり処理も早く、ゲームなどでも多用されている方式です。
 AOに比べて質感は落ちますが、似たような効果をリアルタイム処理できるというメリットがあります。
 SSAOについての簡易的な説明は以下のサイトも併せてご覧になると良いでしょう。

Unity - Unity Manual
http://docs-jp.unity3d.com/Documentation/Components/script-SSAOEffect.html


 SSAO自体は、Crytek社(ゲーム『Crysis』などを開発している会社)が開発した技術です。
 DirectXのHLSL用ソースは、現在では色々な方が書き上げてネットに散見される、割とスタンダードな技術となっています。

 MME用エフェクトスクリプトでの初出は、mqdlさんのSSAOエフェクトとなります。


 それを元にした改変版などは、そぼろさんやおたもんさんにより、改良版として配布されています。


â–  ExShadowSSAO

 そぼろさんが配布されているExcellentShadowに付属しているExShadowSSAOですが、こちらもSSAOではあるものの、MME上ではポストエフェクトとしては機能しません。
 ExShadowSSAO.xをMMDに入れても変化が無く、使用をあきらめている方もいらっしゃるかと思います。

 ExShadowSSAOはMMEではシェーダーエフェクトとして機能します。

 つまり、ExcellentShadowに付属している Full_ES.fx(Full_ES_pmx.x) をモデルないしアクセサリに適用させる必要があります。
SSAO_01
 ExcellentShadowは負荷のかかるエフェクトではありますが、fxファイルにあるパラメータを弄る事により、軽減化させる事もできます。

 ExShadowSSAOの最大のメリットは、シェーダーと共に材質毎に掛けられる事です。

 ポストエフェクト版のSSAOでは画面全体に掛かり、影が出て欲しくない背景部分などにもSSAOが掛かってしまいますが、材質毎に設定できるExShadow版では必要な部分にだけSSAOを掛けることができ、影の管理が楽になります。


■ 影の出方の違い

 恐らくスクリーンショットを見て貰った方が早いでしょう。

MMD標準状態
SSAO_02

o_SSAO_v0_5
SSAO_03

ExcellentShadow + ExShadowSSAO
SSAO_04

 首の後ろの髪、第一砲塔と第二砲塔の間部分などを見比べると分かるでしょう。

SSAO_05


 ポストエフェクトタイプのSSAOでは、影が濃くなり、一見するとディフュージョンに乗算を掛けたようなものと似たような結果に見える事もあります。
 効果としてはデフュージョンとは違い、あくまでも影を付け足すエフェクトなので混同しないようにしましょう。
 処理としても、SSAOを掛けてからディフュージョンを掛けた方が綺麗な結果になり得ます。


■ ExShadowSSAOの汎用性の高さ

 ExShadowSSAOはSvSSAOを元にされているスクリプトで、法線マップ、深度マップを作成して他エフェクトに引き渡す役割を担っています。ですので、他エフェクトから呼び出されない限りは処理されません。組み合わせで使うエフェクトスクリプトとなります。

 ExcellentShadowの場合は、full_ESからExcellentShaodw及びExShadowSSAOに情報を渡し、ExShadowSSAOの結果をExcellentShadowにて処理、出力するという処理になっています(よね?)

 その為、実は結構な数のエフェクトでExShadowSSAOを使用できるようになっているスクリプトは多いです。
 先日紹介したAlternativeFullにも呼び出し機能はありますし、ビームマンPのエフェクトなどはソースを見るとExShadowSSAOの呼び出し部分があったりします。
 私も全てのエフェクトを網羅している訳ではありませんが、
SSAO_06
 このようなソースがあれば、呼び出しているのが分かります。
(図はビームマンPのWaterMain.fxより)


■ まとめ

 つまり以下の点を覚えておくと良いでしょう。

・SSAOはポストエフェクト
・SSAOはコントラスト調整ではなく、影の生成と書き加えるエフェクト
・SSAOはシーンによって使い分けたり、パラメータ調整をするとよりGOOD
・多数のエフェクト作者のものが配布されているので、好みやシーンで使い分けてみよう
・ExcellentShaodw+ExShadowSSAOはより高品質が目指せる
・ExShadowSSAOなどは他エフェクトでも活用されている場合もある。ソースを見てみよう

 となります。
 どのSSAOエフェクトでも言えますが、パラメータといってもソース内のものもそうですが、MMDでのアクセサリ設定にあるSi(サイズ)、Tr(透過度)の設定を変えるだけでもかなり違いますので、エフェクトを入れるだけでなく、この辺りも調整すると良いでしょう。


 さて、前回のエントリからの流れでいうとセルルックベースでのSSAOの使い方などを説明したい所ですが、長くなりますので今回はここで締めます。
 また時間が空いた時にでもまとめてみます。


 それでは良いMMDライフを。


 コンゴウ様と金剛さんは並べると意外と相性いいかもしれないと脳内妄想をしつつ。
関連記事

Comments 0

There are no comments yet.
かんな@バーチャルJC
Admin: かんな@バーチャルJC
ニコニコ動画などでMMD動画をうpしてるしがないユーザーの一人。
バーチャルJC。文筆系の活動もしています。

VRChat & clusterユーザー:kanna3939
継続プレイゲーム:ウマ娘、原神、鳴潮、ゼンレスゾーンゼロ
Steamゲーム:Factorio、Satisfactory、
MMD技術