OpenGL ES 2.0 の GLSL では演算精度の宣言ができます。
宣言 fp精度 vsh fsh --------------------------------------- highp 24bit 以上 必須 option mediump 16bit 以上 必須 lowp 10bit 以上
それぞれ最低限の演算精度が決まっていますが上限はありません。
GPU によっては lowp 宣言しても常に highp とみなされることもあります。
検証プログラムを作って調べてみました。
vertex shader fragment shader ------------------------------------------------------------------ Adreno 200/205 highp highp PowerVR SGX 535/540 highp/mediump/lowp highp/mediump/lowp Tegra 250 (ULP GeForce) highp/mediump/lowp highp/mediump/lowp Mali-400MP highp mediump
変数宣言時の精度修飾子によって演算結果と動作速度が変わるのは
PowerVR と Tegra2 です。
精度を下げると速度が向上する理由としては
・純粋に演算ユニットの能力が不足していたため
・テンポラリレジスタの消費が減ってスレッド並列性が上がるため
の 2つが考えられます。
precision 宣言の影響が全く無いのは Adreno と Mail-400 です。
特に Adreno は Unified shader であり fragment も vertex 同様
highp で演算が行われています。
同じように Mali-400 も固定精度ですが fragment の演算精度は mediump
相当でした。
こちらにまとめています
・Mobile GPU の比較
本当は仮数部の bit 数まで厳密に求めようとしたのですがコンパイラの違いか
最適化のためかうまくいきませんでした。
関連エントリ
・Android Galaxy S2 ARM Mali-400 MP
・iPad2 A5 と浮動小数点演算 VFP/NEON
・Android OpenGL ES 2.0 の圧縮テクスチャ
・Tegra2 Cortex-A9 と浮動小数点演算
・Snapdragon と浮動小数点演算速度