テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】ライティングを理解するためにコーネルボックスを作って遊ぶ

コーネルボックスをご存知でしょうか? なにやらライティング関連のデモによく出てくるアレです。つまり、コレです。

f:id:tsubaki_t1:20160313024303j:plain
ちょっと週末にライティングについて色々と聞いたので、今回はコーネルボックスを作ったりして、ライティングについて色々と試してみようと思います。

コーネルボックスを作る

まずは兎に角、コーネルボックスを作ります。

箱を作る

これは、特に難しい事はせず「Planeで四角を作れば」OKです。DCCツールとか面倒ですし。箱を作る際、隙間が出来ないように後でTranformの数値の小数点を調整すると良いです。

f:id:tsubaki_t1:20160313223841g:plain

色を塗る

あとは左右の壁に「赤」と「緑」のマテリアルを設定します。それ以外の壁は標準色ではなく「白」のマテリアルを設定します。

f:id:tsubaki_t1:20160313224352j:plain

なお、色についてですが使用するのは「非金属ならば50~243、金属ならば168~255の間」です。例えば下の赤は「R240、G0、B0」で塗られています。

また白の壁も「R255,G255,B255」ではなく「R240,G240,B240」で作られています。

これはPBRを正しく表現するために必要な物だそうです。これを守って設定しないと、反射特にDirectional Specularを設定した時に妙な値に見えたり、変な処から光が発光したりする印象です。

f:id:tsubaki_t1:20160314093228p:plain

あとは適当にボックスを二つ置いて、ライトをポイントライトにすれば、まぁ一応形にはなります。

f:id:tsubaki_t1:20160313225101j:plain

照明を蛍光灯に変更する

コーネルボックスに倣って、証明を平べったい感じの蛍光灯にします。
ポイントライトではなく平面な照明を利用する場合、二通りの方法があります。一つはリアライト、もう一つはEmissive(発光)するマテリアルを設定する事です。

今回はEmissiveなマテリアルを使用してみます。

やり方は簡単、マテリアルを作って天井に板ポリを配置、あとはEmissionを2とか3に設定するだけです。
この蛍光灯はstaticなライトマップもしくはLightProbeにしか影響を与えないので、周囲の壁を全てstaticにするのを忘れずに。

f:id:tsubaki_t1:20160313020657g:plain

蛍光灯のような面の光は、ポイントライトやディレクショナルライトと比較して何となくフンワリした感じになります。ポイントライトでやると下のような感じ。

f:id:tsubaki_t1:20160313232307j:plain

リアライトや光るオブジェクトは影がふんわりとした感じになりますが、ポイントライトのようにダイナミックなオブジェクトに影を落とす事が出来ません。その辺り使いどころが難しい所でもあります。

まあ実際、屋外は兎も角屋内は平面光源が多いので、こういった形で光を付与するのはアリかなと個人的には思います。

ライティングについて色々と試してみる

コーネルボックスが出来たので、色々と実験してみます。

光沢を付ける

蛍光灯タイプやベイクしたライトマップには、一つだけ残念な点があります。それは、スペキュラー(光沢)を表現することが出来ないという点です。

例えば球を置いてライトを焼いた場合、プラスチックの材質を持っていたとしてもノッペリした感じで表現されます。

f:id:tsubaki_t1:20160314000553j:plain

こうなった時まずやっておきたいのが、ReflectionProbeの設定です。ReflectionProbeを設定すると、ある程度周囲を反射した絵を表面に張り付ける事が出来るので、なんとなくツルツルっぽく見えます。

このReflectionProbeは何処に置くべきかと言えば、光沢を持ってる奴に持たせちゃうのが一番楽かなと思います。
ただ、ReflectionProbeは環境マップを作って表面に張る機能なので、沢山あると大量のテクスチャが使われます。場合によっては部屋の中心等に置くのが良いかもしれません。

f:id:tsubaki_t1:20160314000725j:plain

もう一つが、LightmapのGeneral GIにあるDirectionl ModeをDirectional Specularに設定する事です。こうすると、材質に反射係数的な何かが付与されて、最終的に光沢が付きます。

f:id:tsubaki_t1:20160314001022j:plain

ダイナミックなオブジェクトとの混ぜ合わせ

ダイナミックなオブジェクトと組み合わせる場合、Lightprobeを使用します。でないと、エリアライトやエミッシブなオブジェクトはダイナミックなオブジェクトに影響を与える事が出来ないからです。

ただ、ダイナミックなオブジェクトに光沢を設定できるのは、ライトのみです。つまり、スペキュラー的な表現は標準機能では使用できない事を意味します。
この辺りはシェーダーを少し書く事で割と何とか出来るかもしれませんが、それはそのうち。

f:id:tsubaki_t1:20160313024525j:plain

光を足すと白になる

カーネルボックス内で光がよく「回る」事を利用して、光の足し算を行います。
光はRGB全色混ぜると白になります。下の画像でやってるのは二つの光源を足したら「R2G2B2」くらいになる光を発しているだけです。

f:id:tsubaki_t1:20160314003721j:plain

f:id:tsubaki_t1:20160314002934j:plain

光の加算で最終的に色を決める…的なアプローチは、単一色の光を置くだけよりも、味わい深い感じの空間が演出出来そうです。

色は光が反射する事で表現される

「色とは「光が反射したもの」なので、「光の中に色成分が含まれないと黒になる」みたいです。

下の画像は、白(R1G1B1)、緑(R0G1B0)、赤(R1G0B0)の3色の光で、青(R0G0B1)の壁を照らしたときの図です。

例えば白のように「すべての成分が含まれている」物に関しては、ちゃんと青が見えているのですが、赤や緑といった「青の成分が含まれていない光を照らした場合」は「青が表現されず黒になる」です。

f:id:tsubaki_t1:20160314004523j:plain

逆に、紫(R1G0B1)や水色(R0G1B1)、青(R0G0B1)のように、青が残っていると美しい青が見えます。中々に興味深い。

f:id:tsubaki_t1:20160314005107j:plain

感想

f:id:tsubaki_t1:20160314224407j:plain

他にも色々とコーネルボックスを改造して試しましたが、何となくライティングについて理解が深まったような気がします(気のせいかもしれませんが)

ライトの動きを確認する際のベイク時間も(それ程大きくないマップのため)時間がかからないので、コーネルボックスで色々やってみたのは割とアタリかなって感じです。

まぁ途中からコーネルボックスが崩れ始めたのはご愛敬。この手のアクションで色々と試行錯誤するのは実際楽しいです

 

なお、この内容はUnite 2016の「Unityとアセットツールで学ぶ「絵作り」の基礎(ライト、シェーダー、ポストエフェクト)」の触りを少し事前に教えてもらった内容です。
もしライティングに興味があるなら、下のセッションは良さそうです。

f:id:tsubaki_t1:20160314095552j:plain

Unity - Unite 2016 Tokyo 講演ガイド