— 光属性を心掛けるアルモジナ(VRChat勢) (@arumogina) 2020年1月16日
JackAはGrabAで取得したGrabTextureを使い回して、視界ジャックで表示している。
(GrabTextueはGrabPass { "_GTexA" } のように命名することで、最初に取得されたテクスチャが後続のPassだけでなく、他のマテリアルでも使い回される)
GrabPassはそのシェーダが実行される直前のレンダリング結果がテクスチャとして保存されている、と考えればいい。
なので、GrabPass取得時のRenderQueueより低い値で描画されたメッシュは表示されない
— 光属性を心掛けるアルモジナ(VRChat勢) (@arumogina) 2020年1月16日
視界ジャックキャンセラーと時止め。
視界ジャックキャンセラーの原理:
RenderQueueを視界ジャックを表示するシェーダより低い値でGrabPassを名前付きで取得する。これをシェーダAで行う。
そのGrabPassテクスチャを視界ジャック表示後より、高いRenderQueueで表示する。これをシェーダBで行う。
時止めの原理:
ぶっちゃけ原理は分かってないので発生条件を書いておく。
上記の視界ジャックキャンセラーと同様のシステムを用意。
シェーダAのRenderQueueを2000以下にセット
シェーダBのrenderQueueをTransparent+2147480647にセット
シェーダAを-2147483648まで下げてみたが動作は同じ。
(VRCではマテリアルのRenderQueueではなく、シェーダに直接書く必要がある)
RQ3900で取得したGrabPassを32767以下で表示した場合は全て3900以下でレンダリングされたものは表示されるが、32768以上で表示すると2500以下でレンダリングしたものにしか表示されない、と。 pic.twitter.com/f9lEJDNt8k
— 光属性を心掛けるアルモジナ(VRChat勢) (@arumogina) 2020年1月18日
時止めが作用せず画面が真っ暗になる場合は、クライアントを再起動すると作用する