UnityのAndroid向け開発で、GL_OES_EGL_image_external
を使う時の注意。
マニュアルの以下に、 textureExternal
を使えと書いてあるが、
これは罠で、動かなくなるので使ってはならない。
https://docs.unity3d.com/2019.4/Documentation/Manual/SL-GLSLShaderPrograms.html
textureExternal
は、ES20ターゲットでもES30ターゲットでも、どちらもtexture2D
に変換される。
実行環境がES30だった場合、これは関数名が間違っているのでエラーになる。
この記述を無視して普通に texture2D
と書くのが良い。
そうすると、ES20ターゲットでは texture2D
になり、
ES30ターゲットでは texture
になるので、どちらでも動くようになる。
ところで、 varying
変数は、vshとfshで共通で書いてはならない。
それぞれのガードマクロの中に個別に書かないとなぜか動かない。
GoogleのARCoreで同じようなコードが書かれているが、問題がある。
ES30ターゲットでは、 GL_OES_EGL_image_external_essl3
を強制しているが、
少なくとも手元の端末(Nexus5)では、ES30を使用できるがこのextensionは使用できない。
よって失敗してしまう。
また、 textureExternal
を使ってしまっている点も問題だが、
ES20でしか使われないように分岐しているのでここでは顕在化していない。
これNexus5がめちゃくちゃ特殊でほとんどのAndroid7以降の機種はむしろGoogleの実装が合ってる可能性が出てきた。