skyboxの使い方

skyboxってなんだ

なんとなくskyboxフォルダにあるskybox.xとかをドロップして使って頂いてるわけですけど、そもそもskyboxってなんでしょうか。skyboxの機能というのは以下のようにいくつかあります

skyboxDisplayを使うと背景の一部にも出来て、見た目上はそれがメインの用途のように思えますが、基本的な使い方チュートリアルで説明したように、skyboxを入れないとモデルの光が当たっていない部分は完全に黒になって怖い感じになってしまいます。そこでskyboxを入れると途端に「普通の見た目」になってくれます。これはどういうことかと言うと、skyboxのスペキュラ・ディフューズ環境マップこそが光の当たっていない、日陰※の部分の明るさの根拠になっているからです。そして、日向の部分の明るさは、日陰の明るさにそのまま光源由来の明るさを足しこんだ物として計算されています。

ですから、skyboxを正しく使わないとライティングの半分あるいはそれ以上を正しく行えていないという事になります。skyboxの設定がおかしい状態ではいくらMMDの平行光源やスポットライトを工夫しても意図した絵は得られないのだという事は知っておくと時間を大分節約できます。

MMDの標準のシェーダ(MMEを使わない状態の事です)ではskyboxなんてなかったわけですけど、MMDの標準のシェーダにはそもそもセルフシャドウ以外の「日陰」の表現が抑えられ(基本的にトゥーンLUTを用いて陰を表現しています)、ハイライトの部分だけ少し明るくする計算と、スフィアマップによる乗算・加算なんかの効果が入ってるだけなので、こんなことは考えなくても絵が描けたんですが、sdPBRは「てきとう」と言いつつ意外とガチな作りになっているのでそこはキチッとやるわけです、まあVersion 1.20まで酷いスペキュラのバグとか色々ありましたけど、はい。

※ここでいう「日陰」とは物体のうちライトの当たっている方向の反対側に出来る「陰」と、物体が光を遮る事で生じる「影」の両方を指しています。物体が入り組んでいる事によって生じる暗い部分はSSDOによる取り扱いになるのでまた別のお話になります。

普通のskyboxとうごくskybox

sdPBRには大きく分けて以下の三種類のskyboxが同梱されています

普通のskyboxの調整法

まず、sdPBRリリース時点から有った、普通のskyboxの調整法についてご説明しましょう。静止画を張り付けているだけですから、そんなにいじれる項目は多くないです。

  1. sdPBR.pmx側で「環境色暗く/明るく」をいじる
  2. skyboxDisplay.pmxの「センター」ボーンでskyboxを回転させる

1.のsdPBRのコントローラ側の「環境色」というのがskybox由来のスペキュラ/ディフューズ環境マップによる色の事です。暗くすれば日陰の部分がより暗くなってシーンが引き締まりますが暗くしすぎると怖い感じになり、明るくするとシーン全体が白っぽくなっていくので、これは分かりやすいと思います。

2.のskyboxの回転なんですが、意外にこれは重要でして、これをいじるとちゃんと環境マップの内容も回転します。これを利用してMMDの光源の向きに合うように適切にskyboxの向きを合わせてやると、大分印象が変わります。ただ、skyboxのテクスチャの問題がありますからY軸周り以外に大きく回転させるとゆがみが気になるかもしれません

口絵にはすず式ミクダヨーさんをお借りしました。ありがとうございます。配布先はリンクをどうぞ!この例では左右で光源の向きが逆に設定されています。左は採光のための窓が多方向にあったり、十分な広さがあるなど開放的な印象を与えるかもしれません、右は窓が画面に出ている範囲より少し広いくらいかな?という感じで、画面に映っている物だけから判断できる内容としては腑に落ちる印象を与えると思います。想定しているシーンの内容によってどちらが正しい光源の設定なのか?という事は変わりますが、skyboxの光源の向きとMMDの光源の向きが違うと絵から受ける印象が大分変わるという例でした。

それから、skyboxにも大きさがあります。デフォルトでは半径10000MMD距離でそれなりに大きいと思うのですが、巨大な背景セットと一緒に使うと背景の一部がskyboxの外に突き抜けてしまう事がありますので、「大きくする」モーフを使うと大きく(モーフ値1.0で10倍に)できます。但し、大きくしすぎるとZバッファなどの計算の精度の問題が出る事があるので不必要に大きくしすぎない方が良いでしょう。

skybox2の調整法(一部、古い情報です)

うごくskyboxはskybox2ディレクトリ下に入っている、DayDynamicSkybox.x,DayDynamicSkyboxDisplay.pmxのセットと、NightDynamicSkybox.x,NightDynamicSkyboxDisplay.pmxのセットの2種類が用意されています。また、Version1.70より、skybox3ディレクトリ下に新しいskyboxが増えました

まずはDayDynamicSkyboxの使い方と調整法について見ていきましょう

昼用skyboxはVersion1.70より、skybox3として作られましたのでDayDynamicSkyboxについては古い情報です。現在ではより軽くて表現力のあるskybox3の使用をお勧めしています。

DayDynamicSkyboxの使い方

下準備はほぼ普通のskybox同様で、

  1. MMDへDayDynamicSkybox.xをドロップする
  2. 「背景(B)-アクセサリ編集」の設定で、DayDynamicSkybox.xを「モデルより後」に表示されるようにする
  3. DayDynamicDisplay.pmxをドロップする

ここまでは全く一緒ですが、DayDynamicSkyboxはMMDの光源の向きを変えると太陽の高さが変わります。これに合わせて環境マップの中身も書き換わるので、skyboxの明るくなっている部分と光源の向きが自動的に合って背景と整合性のあるライティングにしやすいです。色は手動で合わせないといけませんが、向きと比べると見た目に分かりやすいので忘れづらいかなと。

それから、DayDynamicDisplay.pmxにある標高太陽小さくモーフによる調整も意外とバカになりません。

標高モーフはいじるととても分かりやすい効果があると思いますが、数値を大きくすると標高が高くなって空気が薄くなります。空が青く澄んだ感じになり、下からの照り返しが明るくなります。昼間のシーンではデフォルトの標高0.2(2000m相当)あたりで良いと思いますが、夕日のシーンでは赤をより強調できるように標高を0.1よりさらに下げていくと雰囲気が出るかもしれません。直接入力で高い値にしていくと大気圏を超えて空気が無くなるため、空が真っ暗になります(但し宇宙から地球を眺める状態を考慮して作ってないので地球の描写はおかしな感じになります)

太陽小さくモーフは少し効果が分かりづらいかもしれませんが、表示上の太陽が単純に大きくなったり小さくなったりするだけでなく、大気の散乱の具合(具体的には前方散乱の確率)が変わります。「太陽が大きい状態」というのはあちこちに光が散乱しやすい状態で、逆に太陽が小さい状態とは光があまりあちこちに散乱しない状態にあると言えます。

次は夜用であるNightDynamicSkyboxについて説明します

NightDynamicSkyboxの使い方

使えるようにするまでのステップはNightDynamicSkybox.x,NightDynamicSkyboxDisplay.pmxを使う点以外はDayDynamicSkyboxと全く一緒ですが、いじれるパラメータが夜用のほうがずっと多いことに気づくと思います。

しかし、いじれる内容自体は昼用よりも遥かに直感的で分かりやすいので絵にまとめました。クリックして拡大してご覧ください。

skybox3の調整法

Version 1.70より新しいskyboxが増えました。使い方はskybox2と大差ありませんが、見た目がリッチなわりに軽いです。よく観察すると色々粗もありますけど。

skybox3の調整は以下のように行います

空の色をコントロールできるように大気の状態をある程度いじれるようにしましたが、正直分かりづらいと思うので、実例を挙げながら説明しましょう

より晴れ渡った快晴の空にしたい時

標準の状態でもそこそこの晴れですが、もっと青々とした真夏の空みたいなのを作ってみましょう

  1. まず、照明操作パネルでY=-1, X=0, Z=0付近にし、太陽の高度を南中時の状態にしましょう
  2. 表情パネル右上の前方散乱度を0.85程度まで上げて太陽の周辺だけくっきりと明るい状態にします
  3. 表情パネル右下のレイリー高度を0.25程度と低めにし、ミー密度0.15付近と低く設定しましょう

前方散乱とは具体的にはミー散乱の前方散乱係数の事です。ミー散乱は光のどの波長の光も均一に散乱させるので、これを増やすと太陽の光のミー散乱による拡散が抑えられて太陽の周囲と他の部分との間でメリハリがつき、レイリー散乱による青色だけが残るので空の彩度が増します。ざっくり言うとレイリー散乱は増えすぎると空のオレンジ色が増し、ミー散乱を増やすと全体的に空は白っぽくなりますので、青くしたい場合は両方を抑えるといいです。特にミー散乱は天候によって大幅に変化します。

表情パネル右下の大気に関するパラメータは0.5がデフォルト(モーフをいじらなかった場合=0.0にセットされている時)の状態で自動的にセットされる値なので、0.5より小さい場合はデフォルトより低い状態、0.5より大きい時はデフォルトより高い状態であると捉えてください

露骨に真っ赤な夕焼けを作りたい時

今度はかっこいい夕焼けを作ってみましょう(コントローラのモーフの設定はデフォルトに戻してください)

  1. 照明操作パネルでX=0.3, Y=0.1, Z=-1程度にして太陽を水平線付近に太陽を置きます。これだけでもなかなかの夕焼けですが、もっとオレンジにしましょう
  2. まず、表情パネル右上の前方散乱度を0.75程度に上げて、太陽の周囲をくっきりと明るくします。空全体に明るさが広がった状態にしたい場合は逆に0.05程度まで下げてもよいでしょう
  3. 表情パネル右下のレイリー高度を今度は上げて0.8程度にします
  4. 黄昏た暗い夕焼けにしたい場合はレイリー密度も少し上げましょう0.6程度にします
  5. 紫色の夕焼けにしたい場合はオゾン密度も少し上げましょう。0.75まで上げました。

どんよりした曇りの空をつくりたい時

次は曇りのどんよりした空を作ってみましょう(コントローラのモーフの設定はデフォルトに戻してください)

  1. 照明操作パネルの初期化ボタンを押して照明の向きはデフォルトにしましょう
  2. まず、表情パネル右上の前方散乱度を0.08程度に下げて、太陽によって照らされる範囲をベタッと延びた感じにします
  3. 表情パネル右下のミー高度を0.8辺りまで上げて灰色の空にします
  4. 雨が降っている、雷雨であるなど、より暗くしたい場合はミー密度も上げましょう。0.68まで上げてみました
  5. オゾン密度も0.7あたりまで上げると少し不吉な紫がかった空になって雰囲気が出ますね

    作例では入れてませんが、レイリー密度もどんどん上げていくとホラーゲームのような赤黒い絵を作る事が出来ます。これも雰囲気作りに活かせるかもしれませんね

    おまけ オゾン量と季節・地域の差

    国や季節・海沿や山沿いの地域か?都市部なのか?といった条件によってオゾンの量は変わるので、その違いによって季節感や地域感の微妙な違いを絵に含ませる事が出来ます。

    言い訳

    大気シミュレータのような使い道を紹介していますが、正直な所、理論的にやや難解で実装もそこそこ複雑であり、正確にコーディングされているかあまり自信がありません。ですから、色合いだけでもぼちぼち合っているシミュレーション結果が得られているのか?言われると色々間違ってそうではありますから、居ないとは思いますがこのskyboxの色合いから得られた知見を以て本物の大気環境でも同じようになるとは思わないでくださいね。

    結局、普通のskyboxとうごくskyboxはどっちがいいのか

    まず、どっちが扱いが簡単かと言うと、どっちもどっちではありますが、ライティングの観点からいうと実は「普通のskybox」の方が面倒です。なんでかというと光源と矛盾しないようにskyboxの向きも自分で調整しないといけないからです。事実、Version1.10まではライティングがしづらい、という感想がよく見られました。

    例えば室内のシーンだからと言ってskybox_indoor.xを何も考えずに使うと、実はあれskyboxの内容が室内の照明だけではないので不自然な照明になるのです。これは露骨に仕掛けられた罠ではなく、室内のシーンであっても大概の部屋には採光のための窓があるので、それを取り入れたskyboxの方が使いやすかろうという配慮なんです。信じて!

    うごくskyboxはMMDの光源の向きに合わせて表示内容も環境マップの内容も書き換わるので、MMDの光源と矛盾のない絵作りがしやすいというわけですが、例えば光源がシーンの中に一杯あるような場合は「そういうHDR画像を用意して普通のskyboxに貼り付ける」とすれば不必要に重くならないで済みますから、シーンに応じて使いやすい方を使うのが良いと思います。

    とりあえず普通のskyboxは軽いです。これは間違いのない利点です。

    動画の使えるskybox

    Version 1.90より、動画の使えるScreenSkyboxが追加されました。フォルダ名はSkyboxScreenなんですけどアルファベット順的に良いかと思ったのでフォルダ名はそうなってます。

    使い方は他のskyboxとほぼ変わりませんが、tool\sdScreenCaptor.xを入れておく必要があり、sdPBRconfigの全般タブでscreen.bmpを使うにチェックが入っている必要があります。チェックが入ってなくてもScreenSkyboxDisplayには表示されるし環境マップとして適用されはするのですが、テクスチャとして使えないので念のためチェックしておいてください。

    ScreenSkyboxSquare.xと、ScreenSkyboxAspect.xと、ScreenSkyboxSphere.xが有りますが、それぞれの違いは以下の通りです

    ScreenSkybox.xscreen.bmpの中身を立方体(六面とも正方形)に投影します
    ScreenSkyboxAspect.x側面が出力画面の縦横比に合った長方形になっている直方体に投影します。天井(Y+)と床(Y-)の面は正方形のままです
    ScreenSkyboxSphere.x球体に投影します。Equirectangular形式になったパノラマ動画を用いると良い感じになります

    調整法についてはskybox3と同様で、フォグも動画の内容に即した物が掛かります。動画の取り込み品質はsdScreenCaptor.fxの先頭付近の定数をいじるとコントロールできますが、品質を上げると露骨に重くなる上にMMD本体の取り込み品質が上限になるので高品質な動画を背景に表示させる用途としてはどうしても力不足感がありますから、背景に動画を入れるための合成は他の外部ソフトウェアで行うのが良いと思います。

    追加されているパラメータとしては、XYZ軸方向それぞれの濃さを変更するためのモーフが表情操作パネルの左上にありますから、キャラの背中側だけ映り込みをつけたい、といった時に活用できます。濃度を一番薄くすると左下にある地面H/S/Vモーフで指定した単色になります。

    雲のたなびくパノラマ動画なんかをサンプルに付けたい物ですが有料でそれなりにお値段がするものしか見当たらなかったので断念しました。…これを読んでいるあなた、商機かもしれませんよ!?

    ところで、当然ですがScreenSkyboxの内容はMMDの光源の向きの影響を受けません。

    おまけのKuraudo.pmx

    skybox2ディレクトリにはおまけとしてKuraudo.pmxというモデルが入っています。ドロップするだけだとなんのこっちゃという感じですが、Y座標をモリっと、背景に使うモデルにもよりますが250~500くらいの高さまで上げると雲が空に掛かります。

    計算によって真面目かつプロシージャルに雲を生成する方がカッコいいのは分かるんですが、よりよってなんでこんなショボい方法で雲を作る羽目になってるのかというと単に計算で真面目に雲を作ったらクソ重い上に読み込み時間が分単位で掛かるからです。UnityとかUEのアセットにはカッコいいのがいっぱいあってそんなに重くないじゃん?って思うでしょ。あっちはDirectX11、12が使える上にコンパイル済のシェーダをキャッシュしてくれますからMMEと一緒にしてもらっちゃあ困ります。

    そんなわけで雲の使い方なんですが、わりと見たまんまです。雲を掛ける地面からの距離によってのばすモーフで雲を良い感じに引き延ばして使ってください。のばすU/Vモーフで縦方向だけ・横方向だけに伸ばせますが、普通ののばすとU/Vつきののばすモーフは同時に使わない方が制御しやすいです。

    また、色H/S/Vモーフで光の当たっている部分、環境H/S/Vモーフで陰になっている部分の色をそれぞれ指定できます。

    見ての通りですが半透明の部分があるので描画順は適宜設定してください

    詳しい事は↓の動画で説明してます。なかなか読み込まれない時はプレイヤー上部のタイトル文字列にカーソルを合わせると「niconicoで視聴」できるのでそこをクリックしてください

    動画にある通り、平行光源(=MMDの照明)のボリュームライトと一緒に使うと効果的ですが、平行光源のボリュームライトが上手くかからない時は以下の点をチェックしてください