これは STYLY Advent Calendar 2023 の6日目の記事です。
PICO4で動作しないUnityの機能
2023年は、PICO4を利用したMRコンテンツ制作・イベント運営をたくさんやりました!
| 
 | 
|---|
| 大量のPICO4でイベントを開催した様子 | 
コンテンツ制作にあたり、他のデバイスでは動くのに、PICO4(のパススルーモード)では動かない現象にいくつか悩まされたので、今後のために記事にまとめてみました!
PICO4版STYLYで動作確認をしているので、もしかしたらSTYLY特有の現象かもしれませんが、ご了承ください!(その場合はPICOさん。ごめんなさい。)
加算ブレンド
残念ながら 加算ブレンド 方式のシェーダーは、PICO4では動きません!
(公式ドキュメントにそういった記述は見当たりませんが、試してみて動作しませんでした。)
加算ブレンドとは、2つの色を合成するときに、背景色 B と前景色 F をそのまま足し算する手法です。
別の手法に アルファブレンド があります。
こちらは前景色 F に不透明度の α をかける手法です。
背景色 B には (1-α) をかけます。
2023年現在、アルファブレンドの方が主流です。
| 加算ブレンド | アルファブレンド | |
|---|---|---|
| 数式 | C = F + B | C = F・α + B・(1-α)  | 
| shaderファイルの記述 | Blend One One | Blend SrcAlpha OneMinusSrcAlpha | 
| αチャンネル | 不要 | 必要 | 
| PICO4 | 非対応 | 対応 | 
対応策
加算ブレンドのシェーダーがあれば、アルファブレンド方式に切り替えてください。
独自シェーダーで直接編集できる場合は、フラグメントシェーダーの戻り値にαチャンネルを設定してください。
以下のように、RGBからグレースケールを計算して、αチャンネルに代入すればOKです。
fixed4 frag(v2f i) : SV_Target
{
    // RGB値が float3 color に格納されているものとします。
    // テレビのグレースケール変換の公式を使用
    float grayScale = dot(color, float3(0.299, 0.587, 0.114));
    // αチャンネルにグレースケールを代入
    float4 outputColor = float4(float3(color), grayScale);
    return outputColor;
}
Custom Render Texture
残念ながら Custom Render Texture がPICO4では動きません!
(公式ドキュメントにそういった記述は見当たりませんが、試してみて動作しませんでした。)
Custom Render Textureとは、テクスチャの絵を動的にシェーダーで描画できる仕組みのことです。
イメージとしてはこんな感じ!
詳しくは以下のページがわかりやすいです!
上記のページに記載されているようなシンプルなシェーダーでも動作しないことを確認しました。
Color Format を R8_UNORM にしたり、いろいろ試しましたがダメでした。
対応策
もともと2つあったShaderファイルを1つのShaderファイルに統合しましょう!
以下のようなイメージです。
処理Aと処理Bをそれぞれ関数化して、1つのShaderファイルに収めます。
変数名が衝突した場合は、リネームして回避してください。
これにより、CRTを使わなくて済み、PICO4でも描画できるようになりました!
最後に
本記事作成にあたり、以下のページを参考にさせていただきました。
ありがとうございました。
- https://scrapbox.io/rn-works/%E6%AF%94%E8%BC%83_:_%E3%82%A2%E3%83%AB%E3%83%95%E3%82%A1%E3%83%96%E3%83%AC%E3%83%B3%E3%83%89_vs_%E5%8A%A0%E7%AE%97%E3%83%96%E3%83%AC%E3%83%B3%E3%83%89
- https://light11.hatenadiary.com/entry/2018/06/12/004133
- https://forum.unity.com/threads/why-does-rendertexture-never-work-on-android-build-oculus-go.630559/
宣伝
Psychic VR LabではUnityエンジニア・サーバーサイドエンジニアを募集しています!!ご応募お待ちしています!!


