Unityを使って距離感主義をオマージュしてみる
距離感主義、というサイトがあります。
知ったのは数年前、この記事でした。
とても気に入ったので、一時期はPCの壁紙に設定していたこともありました。
先日Twitterで、「#画像フォルダの16番目がお前の守護神」といったハッシュタグが目に入り、何の気無しに画像フォルダを見てみたら、丁度16番目がその壁紙にしていた画像でした。
#画像フォルダの16番目がお前の守護神 高松和樹さんの距離感主義の絵だった。一時期壁紙にしてた。 http://t.co/PHqD4vY4HG pic.twitter.com/xggbJzkAG3
— オノッチ (@onotchi_) 2015, 9月 7
これをみてVRやCGクラスタの人達が"Z Buffer"とか"Depth Map"だとかおっしゃられていたので、なるほど今ならUnityで同様の表現が出来るのでは、と思いやってみました。
↓色々錯誤した結果
よーし、Depth値が適度に調整できるようになったど! #プロ生ちゃん pic.twitter.com/155uAP0fyP
— オノッチ (@onotchi_) 2015, 9月 9
Shaderが公開できたらいいのですが、まだまだ浅学なのでベストなものが作れている気がしません。
とりあえず参考にしたShaderと、そこからどういじったかを書いていきます。
まず参考にしたのはこのサイトのShaderとスクリプト。
カメラに適用する形で利用します。
William Chyr | Unity Shaders - Depth and Normal Textures (Part 1)
スクリプトは変更なし。
Shaderは、コード中に
//for some reason, the y position of the depth texture comes out inverted
o.scrPos.y = 1 - o.scrPos.y;
とあり、Y座標をひっくり返しているのですが、自分の環境では必要がなかったのでここはコメントにしました。
次。コードのままだと手前ほど黒く、遠くほど白くなってしまうので、そこを反転させます。
depth.r = depthValue;
depth.g = depthValue;
depth.b = depthValue;
を
depth.r = 1.0 - depthValue;
depth.g = 1.0 - depthValue;
depth.b = 1.0 - depthValue;
基本的にはこれだけでOKです。
ハマったところはカメラの設定。
キーワードになっている"Depth"ってなんのDepthかというと、カメラからの距離になります。
Depthの一番深いところはCameraのClipping PlanesのFarの値。
この値が被写体に対して大きすぎると、被写体の各部位のDepthに差異がなくなり一色になってしまいます。
なので、適度にFarの値を調整して、被写体にグラデーションがかかるようにしてみてください。
先述のサイトでも「if your image is coming out like the image below~」から同様の説明がされています。
逆にそれを逆手に取ることもできますが…
カメラのclipping planesのfarを大きくすると、モデルはほぼ一色で表示されるようになっちゃうんだけど、それはそれでなんかかっこいい絵が撮れるな。 pic.twitter.com/cOnsGrHQGI
— オノッチ (@onotchi_) 2015, 9月 9
ここから微調整。
①距離感主義の作品は、グラデーションが段階的に塗り分けられています。
これを再現するなら、先ほど手直しした部分でDepthの値を素直にdepth.r/g/bにセットせずに、割ったり掛けたり切り捨てたりして、ある任意の幅で同じ値がセットされるようにします。
ただ個人的にはスムーズにグラデーションさせるほうが好き。
②距離感主義の作品は、微妙に色がついている。
コードのままだと白黒の表現になるので、やはり先ほど手直しした部分で、depth.r/g/bに同じ値を入れずに、若干調整した値をいれるようにします。
以上です。
あとはがんばってポーズや構図を考えるだけです…。ここが、難しいね…。
※追記 2016/05/02 自分なりにエフェクト作ってみました。