Skip to content

Instantly share code, notes, and snippets.

@omochi
Last active October 6, 2020 04:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save omochi/2e6099bc9ac5a740ddfd461346fc8ce0 to your computer and use it in GitHub Desktop.
Save omochi/2e6099bc9ac5a740ddfd461346fc8ce0 to your computer and use it in GitHub Desktop.

textureExternal は使うな

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 は共通化するな

ところで、 varying 変数は、vshとfshで共通で書いてはならない。 それぞれのガードマクロの中に個別に書かないとなぜか動かない。

GL_OES_EGL_image_external_essl3 を ES30 で強制するな

GoogleのARCoreで同じようなコードが書かれているが、問題がある。

https://github.com/dbvkfdl123/AC/blob/226b6273b94e5d072f820a506b35043b797bf448/Assets/GoogleARCore/SDK/Materials/ARBackground.shader

ES30ターゲットでは、 GL_OES_EGL_image_external_essl3 を強制しているが、 少なくとも手元の端末(Nexus5)では、ES30を使用できるがこのextensionは使用できない。 よって失敗してしまう。

また、 textureExternal を使ってしまっている点も問題だが、 ES20でしか使われないように分岐しているのでここでは顕在化していない。

@omochi
Copy link
Author

omochi commented Oct 6, 2020

これNexus5がめちゃくちゃ特殊でほとんどのAndroid7以降の機種はむしろGoogleの実装が合ってる可能性が出てきた。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment