highp
フラグメント シェーダーでは実際にはデフォルトで定義されていないため、これが解析エラーを生成しても驚くことではありません。
壊れたレコードのように感じますhighp
が、フラグメント シェーダーで使用する適切な方法は、最初にプリプロセッサの定義を確認することです: GL_FRAGMENT_PRECISION_HIGH
. このプリプロセッサ定義は、頂点シェーダーで何かを出力するときに、フラグメント シェーダーがサポートするかどうかを知る必要があるため、すべてのhighp
段階で定義されます。
次の GLSL スニペットを検討してください。
#ifdef GL_FRAGMENT_PRECISION_HIGH
# define maxfragp highp
#else
# define maxfragp medp
#endif
I/O の頂点シェーダーとフラグメント シェーダーの間で精度を一致させる必要があるため、次のようなものを使用できます (フラグメント シェーダーと頂点シェーダーの両方に対して)。
maxfragp varying vec2 tex_st;
ちなみに、頂点シェーダーは常に をサポートhighp
しています。これは、フラグメント シェーダーにのみ適用されます。
デスクトップ GLSL では、バージョン 1.30 では精度修飾子が定義されていますが、実際には何もしないことに注意してください。これらは、GLSL ES からのシェーダーの移植を容易にするためだけに存在します。
精度修飾子は、機能のためではなく、OpenGL ES でのコードの移植性のために追加されています。以下で説明するように、これらは OpenGL ES と同じ構文を持ちますが、変数の保存または操作に使用される精度への影響を含め、セマンティックな意味はありません。
拡張機能が精度修飾子の OpenGL ES 2.0 仕様と同じセマンティクスと機能を追加する場合、拡張機能はその目的のために以下のキーワードを再利用できます。

デスクトップ GLSL が扱う精度のタイプは、単精度および倍精度 (GL 4.0+ / ARB_gpu_shader_fp64
) 浮動小数点のみです。そして、これらの変数は、精度修飾子ではなく、さまざまなデータ型 ( dvec2
vs.など)を使用して区別されます。vec2