主にキャラ表示系アプリを作ってる人向けの小ネタです。
- やったこと
- やり方
- 仕組み
- 補足など
1. やったこと
拙作VMagicMirrorの最新版v0.9.0にて、表示しているVRMを影ごと透過pngとしてスクリーンショットする機能を追加しました。
影ごと透過pngが撮れたら何が嬉しいかというと、コラ画像のそれっぽさが増します。
そこで本機能を他ソフトでも再現できるよう作成手順を抜粋してみた、というのが本記事の内容です。
2. やり方
サンプルパッケージを用意しました。Unity 2018.3.7f1で作成しています。
パッケージをインポートしてShadowScreenshot/ShadowScreenshotExample
シーンを開いて実行し、Shift+S
を押すとスクリーンショットが撮れます。
うまく動くとデスクトップ以下に"Screenshot"フォルダが作られ、こういう絵が保存されます。
…ブログ上だと本当に透明に撮れてるのか分かりづらいですね…。
3. 仕組み
影つきのスクリーンショットを撮るまでの手順ですが、まずスクリーンショット自体はUnityの標準機能ScreenCapture.CaptureScreenshotAsTexture
で撮影できます。
背景の透明化については、カメラのClear Flags
をSolid Color
にして、Background
を透明にすればOKです。
その他、細かいコツは「Unity スクリーンショット 透過」とかでググれば他のブログ記事がヒットするはずなので、本記事では省略します。
サンプルパッケージ内での実装についてはScreenshotCapture.cs
スクリプトをご覧下さい。
本記事に固有なのは影の描き足し部分です。
これは以前の記事でも紹介したShadowDrawer
というシェーダーを使って実現しています。
このシェーダーを指定したマテリアルを板ポリに適用し、床やカベに相当する位置に配置することで、追加的に影を描画できます。
いわばShadowDrawer
は「影だけは映る透明な板きれ」みたいな扱いです。
4. 補足など
サンプルパッケージでは2つのライトを使い、影の向きと物体の陰影は独立にコントロールしています。
たとえばShadowLight
の角度を変えると、影の向きは変わりますが、キューブの陰影はそのままです。
2つのライトでの設定の違いは以下の通りです。
NormalLight
= 物体用ライト: 白色のライトで、Shadow Type
がNo Shadows
ShadowLight
= 影用ライト: 真っ黒のライトで、Shadow Type
がSoft Shadows
このように、「物理的には正しくないけど影はコッチに描きたい…」という時はライトを2つに分けると簡単になります。