読者です 読者をやめる 読者になる 読者になる

Onoty3D

Unityに関するメモとか

Unityを使って距離感主義をオマージュしてみる

距離感主義、というサイトがあります。
知ったのは数年前、この記事でした。

高松和樹 距離感主義:DDN JAPAN

とても気に入ったので、一時期はPCの壁紙に設定していたこともありました。

先日Twitterで、「#画像フォルダの16番目がお前の守護神」といったハッシュタグが目に入り、何の気無しに画像フォルダを見てみたら、丁度16番目がその壁紙にしていた画像でした。

これをみてVRやCGクラスタの人達が"Z Buffer"とか"Depth Map"だとかおっしゃられていたので、なるほど今ならUnityで同様の表現が出来るのでは、と思いやってみました。
↓色々錯誤した結果

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~」から同様の説明がされています。

逆にそれを逆手に取ることもできますが…

ここから微調整。
①距離感主義の作品は、グラデーションが段階的に塗り分けられています。
これを再現するなら、先ほど手直しした部分でDepthの値を素直にdepth.r/g/bにセットせずに、割ったり掛けたり切り捨てたりして、ある任意の幅で同じ値がセットされるようにします。

f:id:onoty3d:20150925201433p:plain
ただ個人的にはスムーズにグラデーションさせるほうが好き。

 ②距離感主義の作品は、微妙に色がついている。
コードのままだと白黒の表現になるので、やはり先ほど手直しした部分で、depth.r/g/bに同じ値を入れずに、若干調整した値をいれるようにします。

f:id:onoty3d:20150925201451p:plain

以上です。

あとはがんばってポーズや構図を考えるだけです…。ここが、難しいね…。

f:id:onoty3d:20150925201656p:plain

f:id:onoty3d:20150925201707p:plain

f:id:onoty3d:20150925201727p:plain

※追記 2016/05/02 自分なりにエフェクト作ってみました。