ほげたつブログ

プログラムとアニメーションをかじって生きてる

全国ゲーム制作部合同ゲームジャムに参加しました & SpecularColorバッファを使ったマスク表現

先週末は全国ゲーム制作部合同ゲームジャムでした。
自分は東京で参加しました。
運営の方々と参加された方々、お疲れ様でした。

全国ゲーム制作部 合同ゲームジャム@東ゲ部 - 関東ゲーム制作部 | Doorkeeper
全国ゲーム制作部 合同ゲームジャム@関ゲ部 : ATND
全国ゲーム制作部 合同ゲームジャム@名古ゲ部 - 名古屋ゲーム制作部 | Doorkeeper
ゲーム部合同ゲームジャム in 沖縄琉ゲ部会場 - IGDA琉球大学 | Doorkeeper

当日の様子

非常に楽しませて頂きました。

今回作ったゲーム

東京はテーマが「しろくろ」と「さけ」だったため、真っ白な世界に黒インクを塗って徐々に世界が見えていくといったものを作りました。
ゲームの目的としては真っ白な中に見える全ての銅像をぶっ壊すといったものです。
(たぶんそのうちパッケージされたものが公開される…はず)

自分の担当の一つが上記の白黒表現だったため、下記の様なものを作ってました。

今回はこれについてもう少し詳しく書きます。

Unlitなマテリアルにデカールを貼ってみる

今回は完全にディテールが無い白い世界に色を塗っていくという仕様だったため、まずは単純にUnlitな白いマテリアルに黒いデカールを貼ってみました。

f:id:hogetatu:20160323005739p:plain

表示されない…!

試しにUnlitをやめてDefaultLit+EmissiveColorにしてみると、

f:id:hogetatu:20160323005056p:plain

薄い…!
ブレンドモードを変更すれば対応できるかと思ってドキュメントを読んで色々とやってみたものの、なかなか改善されません。
ちなみにDefaultLit+BaseColorであれば、

f:id:hogetatu:20160323010053p:plain

となるため、EmissiveColorのみのマテリアルとデカールは相性が悪そうです。
(この辺りドキュメントを探してみたが見つからず…。詳しい方がいれば)

スペキュラバッファをマスクとして使用する

この結果では問題があったため、別のアプローチを考えます。
今回はこちらの絵をベースに検証していきます。

f:id:hogetatu:20160323011723p:plain

ポストプロセスでマスクできれば解決できそうなので、SceneTextureで選択できるものの中から使えそうなバッファを探します。
ざっと見て使わなくても表現に影響が出にくそうなものを探していると、SpecularColor が目に入りました。
今回はSpecularを効果的に使用した絵作りの予定は無かったので、このバッファをマスク用に使います。
背景マテリアル(真っ白にしたいもの)のSpecularを 1 に設定し、デカールのマテリアルでは逆に 0 を設定します。
ただし、今回は線路は最初から表示しておいて欲しいとのことだったので、線路のマテリアルのSpecularは 0 を設定します。
この状態でポストプロセスマテリアルにてSpecularColorを出力すると、

f:id:hogetatu:20160323011421p:plain

ほぼ黒ですが、うっすらと出ているようなのでMultiplyしてコントラストを出してみます。

f:id:hogetatu:20160323011527p:plain

これでマスク範囲を出せました。
あとはベースの絵にマスクをかけたものを出力としてあげれば終了です。

f:id:hogetatu:20160323012047p:plain

今回はテーマが「しろくろ」だったため、背景マテリアルは黒一色にして黒いインクを表現しましたが、このように元の色を出すこともできます。
これを実現するポストプロセスマテリアルも非常に簡素なものです。

f:id:hogetatu:20160323020253p:plain

終わりに

今回作ったSpecularColorバッファを用いたマスク表現は本来の使い方ではないため、同じように使えるゲームは限られると思います。
ただエンジンを拡張すれば、ノンフォトリアルなゲームで全体としてUnlitしか使わないものであれば、今回みたいにSpecularを潰して自由に使えたりしないかなとふわっと考えたりしてます。(それよりバッファを新設する方が簡単なのかもしれませんが)
ちょっと特殊な使い方ですが、何かの参考になれば。