VRChat SDK: Web Panel が白っぽい場合の対応
VRChatのWebPanelって、文字や写真が白っぽく(明度が高すぎる感じで)表示されていませんか?
※Webで同様の症状を検索しても引っかからないので私だけ発生している現象なのかしら?
#VRChat のWebPanelの明度が明かるすぎて白っぽく表示されてる件、前から原因探ってるけど分からない。 pic.twitter.com/J9DpQW5WP3
— UUUPA@ATL広尾入り浸り中 (@UUUPACOM) 2018年4月3日
解決にむけて、Twitter上でヒントをいただきつつ段階的に解決していくことができましたので、そのツイートも引用しつつ、解決方法をまとめておきます。
WebPanelの色味(明度)がおかしいのはブラウザ表示のガンマ値が正しくないのが原因らしく、試しにVRchat上で白っぽくなっているWebPanel画像をスクリーンキャプチャして、Photoshopのレベル補正で、ガンマ値2.2の逆数=1/2.2=0.45を適応させると、PCモニタ上の色が再現できます。
おや、明るすぎるって感じではないのですね。
— naqtn(なくとん) (@naqtn) 2018年4月3日
試しにガンマ補正を一般的に使われる値2.2の逆数0.45でかけてみたら同じ感じになりました。(UUUPAさんのツイートの画像を使用してGIMPでガンマ補正(メニュー > 色 > レベル)。左が元のツイートの画像(の右側)、右が補正を掛けたVRChatでの描画) pic.twitter.com/WlQ930viII
いつもお詳しい解説をいただきありがとうございます。ガンマ値調整を思いいたりませんでした。仰る通り下図のように復元できそうです。が、私にShaderスキルがないため午前中徒労してしまい、結局さきほど #VRChat のバグレポートに書き込ませていただきました。 pic.twitter.com/rfXz5xorYV
— UUUPA@ATL広尾入り浸り中 (@UUUPACOM) 2018年4月4日
だから、Unity上で同じようにガンマ値を再調整(degamma?)するシェーダーを書いて、WebPanelのマテリアルのシェーダーに設定してやれば、期待通りの濃い色合いを再現できそうですよね。
ところが、WebPanelコンポーネント(が割り当てられたQuadオブジェクト)って、VRChat上で強制的にシェーダーがUnlit/Textureに変更されてしまうようで、実際検証してみたらその通りでした。
今の仕様では WebPanel は強制的に Unlit/Texture になるようです。
— ure (@uretaro) 2018年4月3日
色味や明度の調整は Duplicate Screens を使ってね、ということみたいです。https://t.co/AJM4g5FOqu
ではどうすればいいかというと、WebPanelコンポーネントには、Duplicate Materialsという項目があり、ここに別のマテリアルを指定すると、そのマテリアルは、WebPanelのスクリーンと同じ内容を表示するマテリアルになります。
※ディスプレイをミラーリングする感じといえば伝わるでしょうか。
そのDuplicateされたマテリアルの方は、カスタムシェーダーを割り当てることができ、Unlitに強制変更されることもありませんので、そのマテリアルにガンマ値を再調整するdegammaシェーダーを指定してやれば良いというわけです。
そのシェーダーについては、私シェーダー初心者なのでデフォルトのシェーダーを小修整して用意しました。
※ソース内コメントにもあるように、詳しく調べずに使った GammaToLinearSpace() 関数が見た目上上手くいったため採用していますが、本当はガンマ値の逆数 1/2.2 を上手く適応させるのが正しいと思います。
諦めきれず、なんとかシェーダーも書けまして解決できたような気がします(右がWebPanel、左がDuplicate Materialしたマテリアルをガンマ再調整したもの)。いろいろ経緯ありましたのでブログにまとめる予定です。ご意見いただき皆様ありがとうございました。とりいそぎご報告と御礼まで。 pic.twitter.com/qaNXAxtESB
— UUUPA@ATL広尾入り浸り中 (@UUUPACOM) 2018年4月4日
次の課題としては、WebPanel画面(Aとします)はリンクテキストやリンク画像をクリックできますが、Duplicateしたマテリアル(Bとします)はあくまでコピーされた画像なので、クリック等はできません。この課題に対しては、
- AとBを同じサイズにし、Bをほんの少し前に重ねるように配置する。
- Bが前面だとクリックできない?→Bのコライダーを消して、後ろのAを触れるようにすれば、Bが前面に表示しながら、後ろのA、つまりWebPanelを操作できる。
という解決法に至りました。この時、通常WebPanel上に表示される「マウスカーソル(白いパーティクルみたいなの)」が見えないのではと心配しましたが、Bをギリギリ前面に配置すれば、マウスカーソルはBよりも前面に表示できています。
仰る通り、コライダー無しですぐ手前に置けば、すり抜けて後ろをクリックできますし、リンクテキストのhoverも同時に反映されました。カーソルも、MouseCursorObjectすら必要なく、標準の白いパーティクルカーソルが一番前面に表示されてくれました。
— UUUPA@ATL広尾入り浸り中 (@UUUPACOM) 2018年4月4日
以上で無事対応できました。Twitterにて解決へのご意見をいただいた@naqtn様、@uretaro様、誠にありがとうございました。