無料アセットで簡単にIBLが出来るオープンソースシェーダLux

この記事は、[Unity アセット真夏のアドベントカレンダー](http://unityassetjp.doorkeeper.jp/events/12843)の24日目です。

# IBLとは
IBLはImage Based Lightingの略で、画像を基にしたライティングという意味です。
ここでいう画像は基本的にキューブマップのことで、キューブマップに応じたライティングを行うことでシーンに設置したライトの色だけでは無く、夕焼けのSkyboxを表示したシーンではオブジェクトが赤みを帯びると言ったメリハリのあるレンダリングを行うことが出来ます。
UnityでIBLができる有名なアセットと言えば[Marmoset Skyshop](https://www.assetstore.unity3d.com/en/#!/content/8880)ですが、今回は無料かつオープンソースで開発が進められているLuxを紹介します。

# Luxとは
[Lux](http://forum.unity3d.com/threads/lux-an-open-source-physically-based-shading-framework.235027/)はオープンソースのPhysically Based Shadingフレームワークです。PBS（物理ベースドシェーディング）は文字通り物理情報を元にシェーディングを行う手法で、木やプラスチック、金属の質感の違いをよりリアルに表現することが出来ます。Unityアセットで有名なものとしては[Alloy](https://www.assetstore.unity3d.com/en/#!/content/11978)があります。
Luxは無料にも関わらず単にIBLが出来るだけではなく、PBSもサポートしている非常に高性能なシェーダーアセットとなっています。
以下がその表示例です。

![Demo Scene1](https://qiita-image-store.s3.amazonaws.com/0/11166/56f04321-a69e-704e-a76e-f72171697170.png)

![Luxを使ったIBL](https://qiita-image-store.s3.amazonaws.com/0/11166/cd025f0b-92ba-ac27-7fa4-2da24f6dd156.png)


<blockquote class="twitter-tweet" lang="en"><p>Unity+SDK0.4+フリーIBL in フルHD＠GT650M <a href="https://t.co/GO2AMx9J8Y">https://t.co/GO2AMx9J8Y</a></p>&mdash; 野生の男 (@yasei_no_otoko) <a href="https://twitter.com/yasei_no_otoko/statuses/493073058316316674">July 26, 2014</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" lang="en"><p>さっきと同じTerrain、キャラを普通に表示した場合 <a href="https://t.co/o7GxvjcxnM">https://t.co/o7GxvjcxnM</a></p>&mdash; 野生の男 (@yasei_no_otoko) <a href="https://twitter.com/yasei_no_otoko/statuses/493074300673748992">July 26, 2014</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

金属のザラついた反射を再現したPBSやSkyboxの色を反映したIBLが正しく動作していることが分かると思います。
Vine動画のようにTerrainやキャラクターにもSkyboxに応じた雰囲気のある描画が行われているのが分かるかと思います。
2つめのドアの画像はLuxで作られたWeb Playerデモからのスクリーンショットで、以下のリンクから試せます。
LuxとUnityのポストエフェクトの組み合わせでUnreal Engine 4やUnity 5のデモに匹敵する描画クオリティが再現されていることが分かると思います。
![Lux Demo](https://googledrive.com/host/0B3n1sS2Im_HhSi1hSElSV2JRbDQ/forthewep.jpg)
[Web Player](https://googledrive.com/host/0B3n1sS2Im_HhZW83ak9TWHFMWFU/full%20resolution.html)

# インストール
Luxは[アセットストア](https://www.assetstore.unity3d.com/en/#!/content/16000)にもありますが、最新版は[GitHubリポジトリ](https://github.com/larsbertram69/Lux)で公開されています。
Download ZIPをクリックしてLux-master.zipをダウンロードし、解凍したファイルをUnityプロジェクトのAssetsフォルダにコピーしましょう。

# 使い方
## Luxのセットアップ
Luxシェーダを使用する際はシーンにSetup Luxコンポーネントを追加したGame Objectが必要です。Add Component欄ではLux Setupと表示されているので注意しましょう。
![Setup Lux](https://qiita-image-store.s3.amazonaws.com/0/11166/33b67798-a1b4-a542-0e8c-186a04184f43.png)

Diffuce Cube、Specular CubeでIBLに用いるキューブマップを選択します。
下のDiffuce/Specular is HDRではキューブマップがHDRテクスチャを使用しているかどうかチェックします。（このフラグが間違っていると正しい色でのライティングが行われません）
Lux_IBL_Diffuse/Specular_Exposureでは露出補正の強弱を設定します。
Lux_Water Floodlevel以下は先月追加された水系のマテリアルを再現する新機能Wetness向けの設定です。今回は紹介しませんが、フォルダ内にデモアセットが含まれているので色々と試してみてください。
## マテリアルの設定
Setup Luxを設定したら、シーンに表示するGame ObjectのマテリアルにLuxのシェーダーを設定します。シェーダー選択欄にLuxカテゴリが作られるので、迷うことは無いでしょう。
例えば1枚目のスクリーンショットの球体はこのようなパラメータが設定されています。
![スクリーンショット 0026-08-24 22.07.37.png](https://qiita-image-store.s3.amazonaws.com/0/11166/21ed9629-4981-46ef-435a-39c77106f4e6.png)
基本的にUnity標準のBumped SpecularシェーダにLux独自の設定が加わっただけなのが分かると思います。
マテリアル単位で別のIBL用キューブマップを設定したり、IBLを無効にすることも出来ます。Ambient Occlusionテクスチャの設定にも対応しています。

## Terrain用設定
LuxをTerrainで使う場合はTerrainにコンポーネントの追加が必要となります。Lux Terrain Controlを追加してください。
アセットストアからダウンロードするとTerrainデモシーンが含まれているのでそちらも参考にしてください。
![Lux Terrain Control](https://qiita-image-store.s3.amazonaws.com/0/11166/d28fdc32-753d-7449-1458-769fd8b5bef4.png)
Setup Luxに加えてこのコンポーネントを加えるだけで、上記Vine動画のようにIBLが適用されたTerrainの表示を行えるようになります。

## その他
Luxにはサブサーフェーススキャッタリングに対応した皮膚や髪、眼球用など様々なシェーダが用意されています。
あまりにも多いので今回の記事では省略しますが、ぜひ試してみてください。

<blockquote class="twitter-tweet" lang="en"><p>これまで見たシェーダの中でも最高級の黒魔術過ぎてパンドラの箱を開いた感がある <a href="https://t.co/Xyd1ZIL57x">https://t.co/Xyd1ZIL57x</a></p>&mdash; 野生の男 (@yasei_no_otoko) <a href="https://twitter.com/yasei_no_otoko/statuses/503217256521019393">August 23, 2014</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# 最後に
Luxは無料で使えてUnity FreeでもUnity Proでも動作する非常に使いやすいアセットです。ソースコードが読めて改変後の商用配布も可能なのでシェーダの勉強にも良いと思います。どんどん使って描画クオリティを上げましょう。

明日は[frontakkさん](http://unity3d.flyingteapot.net/)による「購入したパーティクルアセットをカスタマイズしてみよう」です。