夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

iPhoneとジオメトリシェーダー

本日はシェーダー枠です。

 先日PC上では実行可能なもののiPhone上でUnityアプリをデプロイして実行したところiPhone上ではピンクのシェーダーエラーが発生することがありました。

 調べたところジオメトリシェーダーを含んでいるシェーダーがiPhone上で実行できなかったため今回は調べたことを含めまとめます。

〇ジオメトリシェーダーとは?

ジオメトリシェーダーはグラフィックスパイプラインの一部で、頂点座標の定義を行う頂点シェーダーとピクセル色を決めるフラグメントシェーダーの間に実行されるパイプラインです。

頂点シェーダーから受け取ったデータに対してさらに複製など処理を行います。

 簡単に表現すると頂点シェーダーから受け取ったデータをもとにプログラマブルな処理を加えて再び頂点シェーダーに戻すことも含め様々なことが実行可能です。

redhologerbera.hatenablog.com

 ジオメトリシェーダーを使用することで例えばワイヤフレーム表示やUVの編集などポリゴンごとに処理を行うことができ、エフェクトなど幅広い表現ができるようになります。

iPhoneとジオメトリシェーダー

今回はiPhoneでジオメトリシェーダーが実行できませんでした。

ジオメトリシェーダーはグラフィックスパイプラインで定義されており、これがサポートされているかどうかは使用しているプラットフォームのグラフィックスAPIに依存します。

iPhoneの場合はMetalが使用されます。

MetalはAppleのOSでサポートされるグラフィックスAPIOpenGLOpenCLに似た機能を一つのAPIに統合しています。

このMetalはジオメトリステージをサポートしていません。

https://docs.unity3d.com/ja/2018.4/Manual/Metal.html

これが原因です。

しかしAppleOpenGLおよびOpenGL ESのサポートを廃止しています。

docs.unity3d.com

Unity2022以降はiPhoneアプリは基本的にOpenGLではなくMetalの選択肢のみが推奨されており、実質iPhoneアプリでジオメトリシェーダーを使用することは不可能です。

しかしながらMetalでもComputeShaderやその他の機能のサポートがされているため他の方法で代替する必要があります。

Metalがジオメトリシェーダーをサポートしていない理由としてはMetalの高パフォーマンス性を担保するために必要最低限以外の機能のサポートをしていないシンプルな設計のためという説がありました。

developer.apple.com

前述のとおり代替法があるのであれば高パフォーマンスなジオメトリシェーダーを避ける傾向があるようです。

筆者はComputeShaderを使用したジオメトリシェーダーの代替はやったことが無いのでいずれチャレンジしていきたいと思います。

とりあえずiPhoneでは頑張ってもジオメトリシェーダーはジオメトリシェーダーとして動かすことはできないようです。

本日は以上です。