投稿者 tel | 2014年10月30日

WebGLのシェーダでの演算精度

OpenGL ESではデバイスによって演算精度が異なる。つまりシェーダ内でhighpやmediumの変数のビットサイズが違う。

デバイスでの演算精度は gl.getShaderPrecisionFormat で取得できる。この関数を呼び出すと頂点シェーダ、フラグメントシェーダでの浮動小数点型の精度がわかる。
戻り値がオブジェクトで precision のプロパティにビットが格納されている。

http://jsdo.it/sapphire_al2o3/fCz3

デスクトップのChromeで試してみた結果、floatは全部23が返ってきた。intも指定できるが意味ないのかもしれない。

  • vertex LOW_FLOAT: 23
  • vertex MEDIUM_FLOAT: 23
  • vertex HIGH_FLOAT: 23
  • fragment LOW_FLOAT: 23
  • fragment MEDIUM_FLOAT: 23
  • fragment HIGH_FLOAT: 23

Nexus7 2012の結果。頂点シェーダとフラグメントシェーダで精度が違うみたい。あとhighpが使えない。

  • vertex LOW_FLOAT: 23
  • vertex MEDIUM_FLOAT: 23
  • vertex HIGH_FLOAT: 23
  • fragment LOW_FLOAT: 8
  • fragment MEDIUM_FLOAT: 13
  • fragment HIGH_FLOAT: 0

モバイルの環境では低い精度の型を使ってパフォーマンスを稼ぐけど深度テクスチャとかを扱う場合は精度に注意が必要。逆にデスクトップだとシェーダで precision high float にしておけばよさそう。

 


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

カテゴリー

%d人のブロガーが「いいね」をつけました。