なんとなくskyboxフォルダにあるskybox.xとかをドロップして使って頂いてるわけですけど、そもそもskyboxってなんでしょうか。skyboxの機能というのは以下のようにいくつかあります
skyboxDisplayを使うと背景の一部にも出来て、見た目上はそれがメインの用途のように思えますが、基本的な使い方チュートリアルで説明したように、skyboxを入れないとモデルの光が当たっていない部分は完全に黒になって怖い感じになってしまいます。そこでskyboxを入れると途端に「普通の見た目」になってくれます。これはどういうことかと言うと、skyboxのスペキュラ・ディフューズ環境マップこそが光の当たっていない、日陰※の部分の明るさの根拠になっているからです。そして、日向の部分の明るさは、日陰の明るさにそのまま光源由来の明るさを足しこんだ物として計算されています。
ですから、skyboxを正しく使わないとライティングの半分あるいはそれ以上を正しく行えていないという事になります。skyboxの設定がおかしい状態ではいくらMMDの平行光源やスポットライトを工夫しても意図した絵は得られないのだという事は知っておくと時間を大分節約できます。
MMDの標準のシェーダ(MMEを使わない状態の事です)ではskyboxなんてなかったわけですけど、MMDの標準のシェーダにはそもそもセルフシャドウ以外の「日陰」の表現が抑えられ(基本的にトゥーンLUTを用いて陰を表現しています)、ハイライトの部分だけ少し明るくする計算と、スフィアマップによる乗算・加算なんかの効果が入ってるだけなので、こんなことは考えなくても絵が描けたんですが、sdPBRは「てきとう」と言いつつ意外とガチな作りになっているのでそこはキチッとやるわけです、まあVersion 1.20まで酷いスペキュラのバグとか色々ありましたけど、はい。
※ここでいう「日陰」とは物体のうちライトの当たっている方向の反対側に出来る「陰」と、物体が光を遮る事で生じる「影」の両方を指しています。物体が入り組んでいる事によって生じる暗い部分はSSDOによる取り扱いになるのでまた別のお話になります。
sdPBRには大きく分けて以下の三種類のskyboxが同梱されています
まず、sdPBRリリース時点から有った、普通のskyboxの調整法についてご説明しましょう。静止画を張り付けているだけですから、そんなにいじれる項目は多くないです。
1.のsdPBRのコントローラ側の「環境色」というのがskybox由来のスペキュラ/ディフューズ環境マップによる色の事です。暗くすれば日陰の部分がより暗くなってシーンが引き締まりますが暗くしすぎると怖い感じになり、明るくするとシーン全体が白っぽくなっていくので、これは分かりやすいと思います。
2.のskyboxの回転なんですが、意外にこれは重要でして、これをいじるとちゃんと環境マップの内容も回転します。これを利用してMMDの光源の向きに合うように適切にskyboxの向きを合わせてやると、大分印象が変わります。ただ、skyboxのテクスチャの問題がありますからY軸周り以外に大きく回転させるとゆがみが気になるかもしれません
口絵にはすず式ミクダヨーさんをお借りしました。ありがとうございます。配布先はリンクをどうぞ!この例では左右で光源の向きが逆に設定されています。左は採光のための窓が多方向にあったり、十分な広さがあるなど開放的な印象を与えるかもしれません、右は窓が画面に出ている範囲より少し広いくらいかな?という感じで、画面に映っている物だけから判断できる内容としては腑に落ちる印象を与えると思います。想定しているシーンの内容によってどちらが正しい光源の設定なのか?という事は変わりますが、skyboxの光源の向きとMMDの光源の向きが違うと絵から受ける印象が大分変わるという例でした。
それから、skyboxにも大きさがあります。デフォルトでは半径10000MMD距離でそれなりに大きいと思うのですが、巨大な背景セットと一緒に使うと背景の一部がskyboxの外に突き抜けてしまう事がありますので、「大きくする」モーフを使うと大きく(モーフ値1.0で10倍に)できます。但し、大きくしすぎるとZバッファなどの計算の精度の問題が出る事があるので不必要に大きくしすぎない方が良いでしょう。
うごくskyboxはskybox2ディレクトリ下に入っている、DayDynamicSkybox.x,DayDynamicSkyboxDisplay.pmxのセットと、NightDynamicSkybox.x,NightDynamicSkyboxDisplay.pmxのセットの2種類が用意されています。また、Version1.70より、skybox3ディレクトリ下に新しいskyboxが増えました
まずはDayDynamicSkyboxの使い方と調整法について見ていきましょう
昼用skyboxはVersion1.70より、skybox3として作られましたのでDayDynamicSkyboxについては古い情報です。現在ではより軽くて表現力のあるskybox3の使用をお勧めしています。
下準備はほぼ普通のskybox同様で、
ここまでは全く一緒ですが、DayDynamicSkyboxはMMDの光源の向きを変えると太陽の高さが変わります。これに合わせて環境マップの中身も書き換わるので、skyboxの明るくなっている部分と光源の向きが自動的に合って背景と整合性のあるライティングにしやすいです。色は手動で合わせないといけませんが、向きと比べると見た目に分かりやすいので忘れづらいかなと。
それから、DayDynamicDisplay.pmxにある標高と太陽小さくモーフによる調整も意外とバカになりません。
標高モーフはいじるととても分かりやすい効果があると思いますが、数値を大きくすると標高が高くなって空気が薄くなります。空が青く澄んだ感じになり、下からの照り返しが明るくなります。昼間のシーンではデフォルトの標高0.2(2000m相当)あたりで良いと思いますが、夕日のシーンでは赤をより強調できるように標高を0.1よりさらに下げていくと雰囲気が出るかもしれません。直接入力で高い値にしていくと大気圏を超えて空気が無くなるため、空が真っ暗になります(但し宇宙から地球を眺める状態を考慮して作ってないので地球の描写はおかしな感じになります)
太陽小さくモーフは少し効果が分かりづらいかもしれませんが、表示上の太陽が単純に大きくなったり小さくなったりするだけでなく、大気の散乱の具合(具体的には前方散乱の確率)が変わります。「太陽が大きい状態」というのはあちこちに光が散乱しやすい状態で、逆に太陽が小さい状態とは光があまりあちこちに散乱しない状態にあると言えます。
次は夜用であるNightDynamicSkyboxについて説明します
使えるようにするまでのステップはNightDynamicSkybox.x,NightDynamicSkyboxDisplay.pmxを使う点以外はDayDynamicSkyboxと全く一緒ですが、いじれるパラメータが夜用のほうがずっと多いことに気づくと思います。
しかし、いじれる内容自体は昼用よりも遥かに直感的で分かりやすいので絵にまとめました。クリックして拡大してご覧ください。
Version 1.70より新しいskyboxが増えました。使い方はskybox2と大差ありませんが、見た目がリッチなわりに軽いです。よく観察すると色々粗もありますけど。
skybox3の調整は以下のように行います
空の色をコントロールできるように大気の状態をある程度いじれるようにしましたが、正直分かりづらいと思うので、実例を挙げながら説明しましょう
標準の状態でもそこそこの晴れですが、もっと青々とした真夏の空みたいなのを作ってみましょう
前方散乱とは具体的にはミー散乱の前方散乱係数の事です。ミー散乱は光のどの波長の光も均一に散乱させるので、これを増やすと太陽の光のミー散乱による拡散が抑えられて太陽の周囲と他の部分との間でメリハリがつき、レイリー散乱による青色だけが残るので空の彩度が増します。ざっくり言うとレイリー散乱は増えすぎると空のオレンジ色が増し、ミー散乱を増やすと全体的に空は白っぽくなりますので、青くしたい場合は両方を抑えるといいです。特にミー散乱は天候によって大幅に変化します。
表情パネル右下の大気に関するパラメータは0.5がデフォルト(モーフをいじらなかった場合=0.0にセットされている時)の状態で自動的にセットされる値なので、0.5より小さい場合はデフォルトより低い状態、0.5より大きい時はデフォルトより高い状態であると捉えてください
今度はかっこいい夕焼けを作ってみましょう(コントローラのモーフの設定はデフォルトに戻してください)
次は曇りのどんよりした空を作ってみましょう(コントローラのモーフの設定はデフォルトに戻してください)
作例では入れてませんが、レイリー密度もどんどん上げていくとホラーゲームのような赤黒い絵を作る事が出来ます。これも雰囲気作りに活かせるかもしれませんね
国や季節・海沿や山沿いの地域か?都市部なのか?といった条件によってオゾンの量は変わるので、その違いによって季節感や地域感の微妙な違いを絵に含ませる事が出来ます。
大気シミュレータのような使い道を紹介していますが、正直な所、理論的にやや難解で実装もそこそこ複雑であり、正確にコーディングされているかあまり自信がありません。ですから、色合いだけでもぼちぼち合っているシミュレーション結果が得られているのか?言われると色々間違ってそうではありますから、居ないとは思いますがこのskyboxの色合いから得られた知見を以て本物の大気環境でも同じようになるとは思わないでくださいね。
まず、どっちが扱いが簡単かと言うと、どっちもどっちではありますが、ライティングの観点からいうと実は「普通のskybox」の方が面倒です。なんでかというと光源と矛盾しないようにskyboxの向きも自分で調整しないといけないからです。事実、Version1.10まではライティングがしづらい、という感想がよく見られました。
例えば室内のシーンだからと言ってskybox_indoor.xを何も考えずに使うと、実はあれskyboxの内容が室内の照明だけではないので不自然な照明になるのです。これは露骨に仕掛けられた罠ではなく、室内のシーンであっても大概の部屋には採光のための窓があるので、それを取り入れたskyboxの方が使いやすかろうという配慮なんです。信じて!
うごくskyboxはMMDの光源の向きに合わせて表示内容も環境マップの内容も書き換わるので、MMDの光源と矛盾のない絵作りがしやすいというわけですが、例えば光源がシーンの中に一杯あるような場合は「そういうHDR画像を用意して普通のskyboxに貼り付ける」とすれば不必要に重くならないで済みますから、シーンに応じて使いやすい方を使うのが良いと思います。
とりあえず普通のskyboxは軽いです。これは間違いのない利点です。
Version 1.90より、動画の使えるScreenSkyboxが追加されました。フォルダ名はSkyboxScreenなんですけどアルファベット順的に良いかと思ったのでフォルダ名はそうなってます。
使い方は他のskyboxとほぼ変わりませんが、tool\sdScreenCaptor.xを入れておく必要があり、sdPBRconfigの全般タブでscreen.bmpを使うにチェックが入っている必要があります。チェックが入ってなくてもScreenSkyboxDisplayには表示されるし環境マップとして適用されはするのですが、テクスチャとして使えないので念のためチェックしておいてください。
ScreenSkyboxSquare.xと、ScreenSkyboxAspect.xと、ScreenSkyboxSphere.xが有りますが、それぞれの違いは以下の通りです
| ScreenSkybox.x | screen.bmpの中身を立方体(六面とも正方形)に投影します |
| ScreenSkyboxAspect.x | 側面が出力画面の縦横比に合った長方形になっている直方体に投影します。天井(Y+)と床(Y-)の面は正方形のままです |
| ScreenSkyboxSphere.x | 球体に投影します。Equirectangular形式になったパノラマ動画を用いると良い感じになります |
調整法についてはskybox3と同様で、フォグも動画の内容に即した物が掛かります。動画の取り込み品質はsdScreenCaptor.fxの先頭付近の定数をいじるとコントロールできますが、品質を上げると露骨に重くなる上にMMD本体の取り込み品質が上限になるので高品質な動画を背景に表示させる用途としてはどうしても力不足感がありますから、背景に動画を入れるための合成は他の外部ソフトウェアで行うのが良いと思います。
追加されているパラメータとしては、XYZ軸方向それぞれの濃さを変更するためのモーフが表情操作パネルの左上にありますから、キャラの背中側だけ映り込みをつけたい、といった時に活用できます。濃度を一番薄くすると左下にある地面H/S/Vモーフで指定した単色になります。
雲のたなびくパノラマ動画なんかをサンプルに付けたい物ですが有料でそれなりにお値段がするものしか見当たらなかったので断念しました。…これを読んでいるあなた、商機かもしれませんよ!?
ところで、当然ですがScreenSkyboxの内容はMMDの光源の向きの影響を受けません。
skybox2ディレクトリにはおまけとしてKuraudo.pmxというモデルが入っています。ドロップするだけだとなんのこっちゃという感じですが、Y座標をモリっと、背景に使うモデルにもよりますが250~500くらいの高さまで上げると雲が空に掛かります。
計算によって真面目かつプロシージャルに雲を生成する方がカッコいいのは分かるんですが、よりよってなんでこんなショボい方法で雲を作る羽目になってるのかというと単に計算で真面目に雲を作ったらクソ重い上に読み込み時間が分単位で掛かるからです。UnityとかUEのアセットにはカッコいいのがいっぱいあってそんなに重くないじゃん?って思うでしょ。あっちはDirectX11、12が使える上にコンパイル済のシェーダをキャッシュしてくれますからMMEと一緒にしてもらっちゃあ困ります。
そんなわけで雲の使い方なんですが、わりと見たまんまです。雲を掛ける地面からの距離によってのばすモーフで雲を良い感じに引き延ばして使ってください。のばすU/Vモーフで縦方向だけ・横方向だけに伸ばせますが、普通ののばすとU/Vつきののばすモーフは同時に使わない方が制御しやすいです。
また、色H/S/Vモーフで光の当たっている部分、環境H/S/Vモーフで陰になっている部分の色をそれぞれ指定できます。
見ての通りですが半透明の部分があるので描画順は適宜設定してください
詳しい事は↓の動画で説明してます。なかなか読み込まれない時はプレイヤー上部のタイトル文字列にカーソルを合わせると「niconicoで視聴」できるのでそこをクリックしてください
動画にある通り、平行光源(=MMDの照明)のボリュームライトと一緒に使うと効果的ですが、平行光源のボリュームライトが上手くかからない時は以下の点をチェックしてください
#define DIRECTIONALLIGHT_VOLUME