第二回 EEVEEのレンダリング結果にマスクレイヤーを使う
※2.93にてEEVEEでのレンダーレイヤーへのset holdoutが実装されたためこちらの方法を使う必要は無くなりました。
※2.80現在での話です、すでに2.81にholdoutシェーダーが実装されているので、遅くとも2.82までには従来のマスクレイヤーが搭載されると思います。ですのでどうしても必要な場合の間に合わせの方法とお考え下さい
現状のEEVEEではマスクレイヤーを使うことが出来ません。しかしながらcyclesのほうでは利用可能です。前述したSceneをリンクしてコピーすることでレイヤマスクをEEVEEのレンダリング結果に適用することができます。
将来的にこの方法は使用する必要がなくなると思いますが。今後説明する異なるレンダラーの結果を合成する方法の基本ともなるのでご参照ください。また同様の手段をとればUVやidmask等、現状でEEVEEが対応してないパスをとりあえず利用することも可能です(cyclesを間接的に利用するのでせっかくのEEVEEの高速なレンダリングという利点を無駄にしてしまうという欠点もあります)
以下具体的なやりかたとなります。
まずは普通にこんな感じにマスクしたいオブジェクトを別のCollectionに配置します。
次にこのSceneをlinked copyして新しく作ったScene.001のほうのrender engineをcyclesに変更します。今回はマスク以外の要素は必要ないので出来る限りレンダリングが早くなるようサンプル数やclampを出来る限り低い値にします。filmのtransparentのチェックをオンにするのを忘れないように
マスクしたいCollectionを選択して右クリック→ViewLayer→set holdoutを選びます。するとそのCollectionに含まれるオブジェクトがマスクされます
もとのSceneに戻ってコンポジットエディタを開いてさしあたり以下のようなコンポジットノードを組みます
これをレンダリングするとこのようになります
マスクさえ出来ればあとはいろんな応用が可能です
追記
cyclesのパスを参照しているのでマスクレイヤーだけでなくcryptmatteも使うことが可能です。こっちはこっちで応用が効きそう。
その他メモ等
・単一のオブジェクトだけなら2.81でもholdoutシェーダーあるのでそっち使ったほうが早くて楽です。
・恐らくsetholdoutも、2.79のマスクレイヤーもそのレイヤーのマテリアルをholdoutするマテリアルにオーバーライドしてるようなのでEEVEEにマテリアルオーバーライドがつけばすぐにでもマスクレイヤーは復活するのでは
・またこの仕組み上アルファで抜いてあるマテリアルをマスクレイヤーとして使うことは出来ないっぽい。オブジェクトの形でアルファが抜かれる(2.79でもそう)逆にそういうオブジェクトがある場合それ専用のシェーダー作ることで対応も可能では