本日はシェーダー枠です。
先日PC上では実行可能なもののiPhone上でUnityアプリをデプロイして実行したところiPhone上ではピンクのシェーダーエラーが発生することがありました。
調べたところジオメトリシェーダーを含んでいるシェーダーがiPhone上で実行できなかったため今回は調べたことを含めまとめます。
〇ジオメトリシェーダーとは?
ジオメトリシェーダーはグラフィックスパイプラインの一部で、頂点座標の定義を行う頂点シェーダーとピクセル色を決めるフラグメントシェーダーの間に実行されるパイプラインです。
頂点シェーダーから受け取ったデータに対してさらに複製など処理を行います。
簡単に表現すると頂点シェーダーから受け取ったデータをもとにプログラマブルな処理を加えて再び頂点シェーダーに戻すことも含め様々なことが実行可能です。
ジオメトリシェーダーを使用することで例えばワイヤフレーム表示やUVの編集などポリゴンごとに処理を行うことができ、エフェクトなど幅広い表現ができるようになります。
〇iPhoneとジオメトリシェーダー
今回はiPhoneでジオメトリシェーダーが実行できませんでした。
ジオメトリシェーダーはグラフィックスパイプラインで定義されており、これがサポートされているかどうかは使用しているプラットフォームのグラフィックスAPIに依存します。
iPhoneの場合はMetal
が使用されます。
MetalはAppleのOSでサポートされるグラフィックスAPIでOpenGLとOpenCLに似た機能を一つのAPIに統合しています。
このMetalはジオメトリステージをサポートしていません。
https://docs.unity3d.com/ja/2018.4/Manual/Metal.html
これが原因です。
しかしAppleはOpenGLおよびOpenGL ESのサポートを廃止しています。
Unity2022以降はiPhoneアプリは基本的にOpenGLではなくMetalの選択肢のみが推奨されており、実質iPhoneアプリでジオメトリシェーダーを使用することは不可能です。
しかしながらMetalでもComputeShaderやその他の機能のサポートがされているため他の方法で代替する必要があります。
Metalがジオメトリシェーダーをサポートしていない理由としてはMetalの高パフォーマンス性を担保するために必要最低限以外の機能のサポートをしていないシンプルな設計のためという説がありました。
前述のとおり代替法があるのであれば高パフォーマンスなジオメトリシェーダーを避ける傾向があるようです。
筆者はComputeShaderを使用したジオメトリシェーダーの代替はやったことが無いのでいずれチャレンジしていきたいと思います。
とりあえずiPhoneでは頑張ってもジオメトリシェーダーはジオメトリシェーダーとして動かすことはできないようです。
本日は以上です。