Closed Rinloid closed 3 years ago
フラグメントシェーダーによる highp のサポートはベンダーの任意ですので、出せる精度は端末によって異なります。しかし Natural Mystic は座標系の変数をすべて highp で varying しているようです。したがって、一部の端末では精度が出せず、バグが発生する可能性があります。これは GL_FRAGMENT_PRECISION_HIGH を使用して、highp / mediump を自動的に切り替えることによって解決できます。
例:
#ifdef GL_FRAGMENT_PRECISION_HIGH #define hm highp #else #define hm mediump #endif
この場合、 hm が端末がフラグメントシェーダーで出せる精度に応じて highp / mediump として定義されるので、varying hm vec3 wPos; といように varying すれば問題ありません。また varying の段階で切り替える必要があるので、 vertex でも同じことをする必要があります。
varying hm vec3 wPos;
公式のまとめです: https://www.khronos.org/opengles/sdk/docs/reference_cards/OpenGL-ES-2_0-Reference-card.pdf
また、vertex で highp が使えるというのは仕様書に書いてありますので、引き続き POS3 posw = abs(POSITION.xyz - 8.0); を使用してください。
POS3 posw = abs(POSITION.xyz - 8.0);
修正しました。ありがとうございます。
フラグメントシェーダーによる highp のサポートはベンダーの任意ですので、出せる精度は端末によって異なります。しかし Natural Mystic は座標系の変数をすべて highp で varying しているようです。したがって、一部の端末では精度が出せず、バグが発生する可能性があります。これは GL_FRAGMENT_PRECISION_HIGH を使用して、highp / mediump を自動的に切り替えることによって解決できます。
例:
この場合、 hm が端末がフラグメントシェーダーで出せる精度に応じて highp / mediump として定義されるので、
varying hm vec3 wPos;
といように varying すれば問題ありません。また varying の段階で切り替える必要があるので、 vertex でも同じことをする必要があります。公式のまとめです: https://www.khronos.org/opengles/sdk/docs/reference_cards/OpenGL-ES-2_0-Reference-card.pdf
また、vertex で highp が使えるというのは仕様書に書いてありますので、引き続き
POS3 posw = abs(POSITION.xyz - 8.0);
を使用してください。