👾

Unity認定Associateコースウェアの進め方 その4

2024/01/11に公開

今回はコースウェア 6章からの内容に沿って、サンプルゲーム ZombieToys のシーンを実際に変更していきます。

ライティング

3DCGにおける絵作りにおいて、非常に重要な要素がライティングです。例えば、以下のシーンでは背後から差し込む一つのライトが、状況の絶望感などを表現する役割を果たしています。

上記は、Unity Demo チームが作成した Adam という映像作品で、コースウェアではライティングの開設における参考シーンとして用いられています。この Adam は、Veselin Efremovが脚本・監督を務めており、受賞歴もある有名なリアルタイムレンダリングのショートフィルムです。こちらから全編無料で見ることができますので、興味のある方はぜひ覗いてみてください。
さて、前置きはこの位にして、ZombieToys のライティングには言っていこうと思います。

ZombieToys におけるライティング

ZombieToys Chapter 5 の Assets/Scenes/Main.unity を開くと、既にライティングがなされたシーンが配置されていることが分かります。ここにいくつかの光を加えていこうと思います。

基本的なライティングである Point, Directional, Area 等のライトの説明は別の文献に譲って、ここではレイヤーによるライティングの制御に注目してみましょう。

レイヤーとライティング

Unityにおけるレイヤーとは、ゲームオブジェクトを分離するためのツールです。レイヤーは、シーン内のキャラクター、小道具、風景、カメラ、ウェイポイントなどを表すことができるUnityシーンの基本オブジェクトであり、ゲームオブジェクトの機能はそれにアタッチされたコンポーネントによって定義されます (引用)。

レイヤーを用いると、ライトにオブジェクトを制限することができます。少し実験してみましょう。初めに、実験用のスポットライトを ZombieToys の部屋に追加します。

ここで、Inspector の Layers を選び、User Layer 6 に Chair を追加します。

そして、画面右前方にある椅子らしきオブジェクトを選択して、Inspector の Layer を 6. Chair に変更します (このオブジェクトは Chair ではなく Stool と表現するのが英語的には正しいですが、分かりやすさのためここでは Chair とします)。

そして、再度追加したスポットライトを選択して、Inspector の Light の項目にある Culling Mask を Chair に変更すると、以下のように椅子のみがライトの光に当てられることが分かります。

このように現実世界では難しい光の制御がゲームエンジンの世界では容易に実現できます。

影の描画

CGの絵をより良いものにする重要な要素に影があります。Unityは実世界の光の影響をリアルタイムに計算可能な計算によって近似することで、様々な影の表現ができます。
先ほど設置したスポットライトに照らされているオブジェクトは、現時点では影ができないようになっているので、Spot Light の Inspector の Light->Shadow TypeHard Shadow に変更しましょう。すると、以下のように変化します。

同じように、対象のオブジェクトに対して影が投影されないようにすることもできて、オブジェクトの inspector から Mesh Renderer->Receive Shadow をオフにすれば適用されます。影の計算は少なからず時間がかかるので、自ら光を発する物体等の現実世界では影ができないようなオブジェクトに適用することで、計算量を減らすことができます。

Shadow Type にはソフトシャドウ (Soft Shadow) とハードシャドウ (Hard Shadow) がありますが、これらの違いは、生成される影の見た目にあります。具体的には、ハードシャドウはよりシャープなエッジを持つ影を生成します。ハードシャドウはソフトシャドウと比較して特にリアルではありませんが、処理量が少ないため、多くの用途で使用できます (参考)。

各オブジェクトの影はそれぞれ個別に見た目を調整することができるので、試しに椅子の影をもう少し自然いしてみましょう。
もっとも簡単な方法は Light->Shadow Type->Realtime Shadows->Resolution を より高いレベルに設定することです。Low Resolution はドット絵のような非常に荒い影を生成し、Very High Resolution は非常に滑らかな影を生成します。もちろん、計算負荷はレベルに応じて上昇するので、見た目が許す限り低い値に設定することが望ましいです。

他にも、Bias や Normal Bias といったパラメータや、αテクスチャを用いて影の模様を変更する Cookie 等、様々な方法で影の見た目を変更することができるので、気になる方はぜひ色々調べて見てください。

ライトのベイキング

光の計算は非常に重いため、全てをリアルタイムに行うのではなく、事前に計算が可能な部分は先に計算をして、テクスチャのようにオブジェクトの表面に焼き付ける (ベイクする) ことができます。これは、ゲームエンジンの世界では非常に一般的なテクニックであり、ベイキング (baking) と呼ばれます。
ライトをベイクすると、そのオブジェクトのテクスチャに "ライトマップが追加されます。

ライトマッピングは、シーンのサーフェスの明るさを事前に計算し、後で使用するためにライトマップと呼ばれるテクスチャに結果を保存する処理です。

ライトのベイクを適用するには、対象オブジェクトをすべて static にする必要があります。ライトのベイクとは、本来であれば光源から出た光が複雑な経路を経てオブジェクトの表面にたどり着き、それが反射して人間の目に入ってくるプロセスを半ば省略しているようなものなので、光源や対象オブジェクトの位置が動くと、また計算をし直さなければいけなくなります。この計算はリアルタイムに実行するには重すぎるので、Unity 等のリアルタイムゲームエンジンでは、ライトのベイクを行うことができるオブジェクトは、ゲーム中で動かないことが保証されているものだけに制限されています。
対象のオブジェクトを static に変更するには Inspector 右上のチェックボックスにチェックを入れます。

ライトを実際にベイクするには、window->Rendering->Lighting を選択して、Lighting ウィンドウ右下の "Generate Lighting" をクリックします

ライトのベイクにはある程度の時間がかかります。実際にベイクが実行されていることを確認するには、画面右下に以下のようなステータスバーを見るとよいでしょう。

水色の部分が一番右端にたどり着いたらベイクが完了です。

少し短いですが、今回はここまでです。

  1. 1章~3章:連載の背景 & コースウェアの購入の仕方など
  2. 4章~5章: アセット管理やマテリアル、シェーダの基礎
  3. 5章~6章: ZombieToysの仕様と開発準備について
  4. 6章: ライティングについて ← イマココ

Discussion