2

Ubuntu 13.10 (64 ビット) 上の Mesa 9.2.1 で OpenGL 3.0 に奇妙な問題が発生します。明示的な精度で変数を定義すると (次のように: highp vec2 v;)、エラーが発生します。

syntax error, unexpected VEC2, expecting ',' or ';'

何らかの理由で精度修飾子が無効になっているようです。Mesa のリリース ノートは状況を明らかにしていません。バグではなく、通知もトピックに関連しています。

OpenGL ES 3.0 精度修飾子を使用した PS は正しく機能します。

4

2 に答える 2

3

必ず指定してください#version 130

#versionディレクティブがない場合、 OpenGL は#version 110、精度修飾子が最も確実に有効でない場所にデフォルト設定されます。

OpenGL ES 3.0 精度修飾子を使用した PS は正しく機能します。

当然のことです。精度修飾子は、両方#versionの OpenGL ES GLSL で機能します。

于 2013-11-21T17:11:16.793 に答える
2

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 シェーディング言語 (バージョン 1.3) - 4.5 精度修飾子 - pp. 35

精度修飾子は、機能のためではなく、OpenGL ES でのコードの移植性のために追加されています。以下で説明するように、これらは OpenGL ES と同じ構文を持ちますが、変数の保存または操作に使用される精度への影響を含め、セマンティックな意味はありません。

拡張機能が精度修飾子の OpenGL ES 2.0 仕様と同じセマンティクスと機能を追加する場合、拡張機能はその目的のために以下のキーワードを再利用できます。

  ここに画像の説明を入力

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

于 2013-11-21T20:24:08.043 に答える