web-dev-qa-db-ja.com

フラグメントシェーダーの精度を設定する必要があるのはなぜですか?

私はWebGLを学びます。次のシェーダーは正常に動作します。

// vertex.shader
// precision mediump float;
attribute vec4 a_Position;
attribute float a_PointSize;

void main(){
  gl_Position = a_Position;
  gl_PointSize = a_PointSize;
}

そして

// fragment.shader
precision mediump float;
uniform vec4 u_FragColor;

void main(){
  gl_FragColor = u_FragColor;
}

フラグメントシェーダーの精度を設定する必要があるのはなぜですか?頂点シェーダーはこれなしで機能しますが、フラグメントシェーダーはこのコード行なしでは機能しません(私が見るように)。なぜ異なる動作が存在するのですか?

以前 this を読みましたが、役に立ちませんでした。

19
Andrey Bushman

OpenGL ES 2.0のフラグメントシェーダーのfpタイプには、デフォルトの精度はありません。

頂点シェーダーでは、浮動小数点型のデフォルトの精度を明示的に設定しない場合、デフォルトはhighpです。ただし、フラグメントシェーダーのデフォルトがhighpの場合も、OpenGL ES 2.0はrequireをサポートしていないため、問題が発生します。フラグメントシェーダーステージでの高精度浮動小数点型。

OpenGL ESシェーディング言語 -4.変数と型-pp。35-36

フラグメント言語には、浮動小数点型のデフォルトの精度修飾子はありません。したがって、浮動小数点、浮動小数点ベクトル、行列変数の宣言の場合、宣言に精度修飾子を含めるか、デフォルトの浮動小数点精度を事前に宣言しておく必要があります。

4.5.4利用可能な精度修飾子

組み込みマクロGL_FRAGMENT_PRECISION_HIGHは、フラグメント言語でhighp精度をサポートするシステムで1つに定義されています

#define GL_FRAGMENT_PRECISION_HIGH 1

また、フラグメント言語でhighp精度をサポートしていないシステムでは定義されていません。定義すると、このマクロは頂点言語とフラグメント言語の両方で使用できます。 highp修飾子はフラグメント言語のオプション機能であり、#extensionでは有効になっていません。

17

簡単な答えは、仕様ではフラグメントシェーダーのデフォルトのfloat精度が定義されていないため、自分で指定する必要があるということです。

私はいつもデフォルトがないのはちょっと変だと思っていました。それ以外はすべてデフォルトの精度です。デフォルトはhighpにすることはできません。フラグメントシェーダーで使用できることが保証されていないためです。しかし、デフォルトでmediumpにできない理由はわかりません。 mediumpintのデフォルトであり、floatも同様です。

説明は、仕様のセクション10(「問題」)でかなり明確になります。このセクションには、仕様の議論中に開かれたさまざまな質問が含まれています。答えが選ばれた理由を説明する説明がしばしばあります。

特に、「10.3プレシジョン修飾子」はこれを扱います。質問と回答(85ページ)の1つは次のとおりです。

デフォルトの精度がありますか?現在指定されているものと同じくらい高いデフォルトの頂点精度を指定することは理にかなっています。フラグメント側のデフォルトの精度がどうあるべきかについての合意はありません。

解決策:頂点シェーダーのhighp、フラグメントシェーダーのデフォルトの精度はありません。

これの重要な部分は次のとおりだと思います"同意はありません"。彼らはデフォルトの精度を定義したかったようですが、異なるベンダーはそれがどうあるべきかについて合意することができず、非常にデッドロックになっていて、まったく定義していませんでした。

10
Reto Koradi