Bakulog

獏の夢日記的な何か。

【Unity】透過スクリーンショットを撮るとき影つきで撮影する方法

主にキャラ表示系アプリを作ってる人向けの小ネタです。

  1. やったこと
  2. やり方
  3. 仕組み
  4. 補足など

1. やったこと

拙作VMagicMirrorの最新版v0.9.0にて、表示しているVRMを影ごと透過pngとしてスクリーンショットする機能を追加しました。

baku-dreameater.booth.pm

影ごと透過pngが撮れたら何が嬉しいかというと、コラ画像のそれっぽさが増します

f:id:baku_dreameater:20190929123435p:plain

そこで本機能を他ソフトでも再現できるよう作成手順を抜粋してみた、というのが本記事の内容です。

2. やり方

サンプルパッケージを用意しました。Unity 2018.3.7f1で作成しています。

drive.google.com

パッケージをインポートしてShadowScreenshot/ShadowScreenshotExampleシーンを開いて実行し、Shift+Sを押すとスクリーンショットが撮れます。

うまく動くとデスクトップ以下に"Screenshot"フォルダが作られ、こういう絵が保存されます。

f:id:baku_dreameater:20190929123822p:plain

…ブログ上だと本当に透明に撮れてるのか分かりづらいですね…。

3. 仕組み

影つきのスクリーンショットを撮るまでの手順ですが、まずスクリーンショット自体はUnityの標準機能ScreenCapture.CaptureScreenshotAsTextureで撮影できます。

背景の透明化については、カメラのClear FlagsSolid Colorにして、Backgroundを透明にすればOKです。

その他、細かいコツは「Unity スクリーンショット 透過」とかでググれば他のブログ記事がヒットするはずなので、本記事では省略します。

サンプルパッケージ内での実装についてはScreenshotCapture.csスクリプトをご覧下さい。

 

本記事に固有なのは影の描き足し部分です。

これは以前の記事でも紹介したShadowDrawerというシェーダーを使って実現しています。

このシェーダーを指定したマテリアルを板ポリに適用し、床やカベに相当する位置に配置することで、追加的に影を描画できます。

f:id:baku_dreameater:20190929131303p:plain

いわばShadowDrawerは「影だけは映る透明な板きれ」みたいな扱いです。

4. 補足など

サンプルパッケージでは2つのライトを使い、影の向きと物体の陰影は独立にコントロールしています。

たとえばShadowLightの角度を変えると、影の向きは変わりますが、キューブの陰影はそのままです。

f:id:baku_dreameater:20190929131621p:plain

2つのライトでの設定の違いは以下の通りです。

  • NormalLight = 物体用ライト: 白色のライトで、Shadow TypeNo Shadows
  • ShadowLight = 影用ライト: 真っ黒のライトで、Shadow TypeSoft Shadows

このように、「物理的には正しくないけど影はコッチに描きたい…」という時はライトを2つに分けると簡単になります。