これは 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エンジニア・サーバーサイドエンジニアを募集しています!!ご応募お待ちしています!!