セカイのテッペンにUIを描いてみる
ラズパイ止めました
費用対効果がないってことで開発テーマそのものが破棄されました。無念。
というわけで、ゲーム制作に戻ります。
しぐれういを描くわけではない
「VRでHMDみたいなUI描きてぇナァ」というわけで、実はGW中に着手しており、基本部分は実機動作確認できていたのだけれど、オブジェクトの至近に移動した場合、UIオブジェクトが対象のオブジェクトに埋まってしまう状態で放置していたので、これを解決しようと思う。
尚、わりと本番に近い作成内容なので、画像、ソースは一切なし。
まぁ、大した制作内容ではないんだが、一応ね。
ちなみに今回はシェーダーを理解してる人風に記述しているので、「シェーダー?何それ?」という人は、まずシェーダーについて勉強していただきたい。
まぁ、筆者も対して理解しとらんケドな。
対策前はどうだったのか?
HMDということで背景透過でフォント他諸々を描画するから、アンチエイリアスは必要だろうということで、アルファブレンディングできるシェーダー記述を調べてみた。
尚、参考にしたのはこれとは違うかもしれないが、要点は
Tags { "RenderType"="Transparent" "Queue"="Transparent" }
と、
Blend SrcAlpha OneMinusSrcAlpha
である。
アルファブレンディングに直接関連するのは後者だが、例えば戦闘機のキャノピーを描いたとして、キャノピーと、キャノピーを透過した先のオブジェクトをアルファブレンドして描く必要があるが、キャノピーが先に書かれるとZテストで透過した先のオブジェクトの描画が弾かれるため、キャノピーが視線上の最前面にある場合はキャノピーしか書かれず、キャノピーの向こう側に異世界へのポータルが出現することとなる。
これを回避するための前者記述である。
ついでにBlendはこちら。
しかしこれだけでは、複数UIが重なった場合、やはりZテストの問題が解決できない。
ならば「Zバッファに書き込まなきゃZテストしないからいいじゃね?」ということで、
ZWrite Off
を記述。
これで万事解決ヤッター!と思いきや、透過しない近接オブジェクトにUIが埋もれた...というのが、事の顛末である。
で、どうしたのか
素直に他力本願。
「Zテストさせない」←まちがい
「Zテストに必ず成功する」←せいかい
ZWrite Off
を削除して
ZTest Always
で無事解決。というか、マニュアルよく読めと。