
100日後に○○
例のワニ以降、SNSで「#100日後に○○」とタグが付いた投稿が増えていて安易だなぁと思いつつ「#100日後に退職する47歳」の投稿を楽しみにしている皆さんこんにちは。
IT業界の土方作業を経験した方なら誰しも身に覚えのある話ばかりで、私も興味深く拝見させてもらっています。現場には顔を見せない上役や営業が電話やメールやらでどんどん口を出して混乱している現場を更に混乱させる有様はこの業界のあるあるですね。
会心の1ゲー
テレビ朝日で毎週木曜深夜に放送されている「会心の1ゲー」という番組で、私が以前unityroomに投稿した「Supra animus quo」というゲームを遊んでいただけたらしく、その模様が今週分の放送回で放送されるそうです。
また、同じくunityroomに投稿した「The two met」も9月分の放送で紹介して頂けるそうで誠にありがたい限りです。
以前よりこの番組ではunityroomの投稿ゲームをいくつか取り上げており、私も小耳にはさんでは内心羨ましく思っていたのですが、まさか二つもピックアップしてもらえるとは夢にも思っていなかったので驚くばかりです。残念ながら私の住んでいる地域では放送されていないのでTVerでの配信待ちになるのですが、配信されたらPCの前で正座して視聴したいと思います。
立体スライドパズル
さて、前回はRenderTextureでcameraの映像を表示させた平面を立方体の形状で分割させて、3D空間が分割された(ように見える)画面を作ることまでできました。
後はこれをスライパズルの要領で動かせばパズルの完成だと思っていたのですが・・・

結果としては思った通りにはいきませんでした。理由は大きく二つほどあって、一つは分割した映像を違う位置へ違う位置へ動かしてみると

こんな感じになります。3D空間が分割されたというよりは側面に映った映像が分割しているようにしか見えない。
各立方体の初期状態では見えていない面に対しては何も描画しないようにしているのですが、このため立方体の「中に」オブジェクトがあるようには見えず、立方体の「側面に」映っている用しか見ない。

もちろん位置を動かした時に両面すべて表示させることもできるのですが、そうした場合も問題があって、それがもう一つの問題「ステンシルバッファを利用してマスキングした部分が二つの立方体で重なった場合に描画順を制御できない」という問題。

上の動画を見て一瞬、「ん?」と不思議に思う箇所があると思います。
それもそのはずホール部分が中央下に来た時、上の立方体部分の中に下の立方体の「通常では見えない部分」の映像が見えています。

この部分
これはステンシルバッファに書き込む描画順が「下の立方体→上の立方体」ではなく「上の立方体→下の立方体」となっているため、ステンシルバッファに書き込まれる値が「下の立方体のステンシル値」で上書され、結果として下の映像が映し出されているのだと思います。
調べてみるとunityでは不透明分の描画順はZ方向に厳密にソートされているわけでなくRenderQueueの値も影響するらしいので、厳密に描画順を決定するならこのRenderQueueを変える必要があるらしい。
とはいえ、これは静止画でなくパズルとして各立方体の位置を動かす必要があるため、RenderQueueの値で調整するのは難しいと思います。
パズル内の場所によってステンシルバッファに書き込む値を決めて参照時に「Greater/Less」でレンダリングするという手も考えたのですが、そもそもシェーダのステンシル値を動的に変えられるのかも不明で、う~ん、どうしよう。。。と悩んでいる最中です。