web-dev-qa-db-ja.com

GLSL ES 2.0(iPhone / iPod touch / iPad用)のhighp floatの精度はどのくらいですか?

私は理想的には28ビットの仮数を必要とするシェーダーを持っていますが、使用する量が少なくパフォーマンスが低下する可能性があります。 OpenGL ESでの「highp」の精度はどのように判断できますか?それはおそらく16ビットの仮数のFP24ですが、OpenGLに質問する方法や確実な方法がわかりません。何か案は?

31
gonzojive

GetShaderPrecisionFormatでシェーダータイプの範囲と精度をクエリする

int range[2], precision;
glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, range, &precision);

highp floatの範囲と精度を提供します。

12
Chris Dodd

OpenGL ESシェーディング言語リファレンス から:

  • highp-16ビット、浮動小数点の範囲:-2 ^ 62〜2 ^ 62、整数の範囲:-2 ^ 16〜2 ^ 16
  • mediump-10ビット、浮動小数点の範囲:-2 ^ 14〜2 ^ 14、整数の範囲:-2 ^ 10〜2 ^ 10
  • lowp-8ビット、浮動小数点の範囲:-2〜2、整数の範囲:-2 ^ 8〜2 ^ 8
32
Brad Larson

私の高価なおもちゃのラインでの私のテストでは:

Intとfloatの両方で、フラグメントシェーダーと頂点シェーダーの精度と範囲は同じです。

したがって、すべての組み合わせを完全にリストすることはしません。

また、intの精度は常に0と定義されていることに注意してください。

PowerVR SGX543MP3(iPhone 5):

  • フロート
    • 低:精度= 8、範囲= 0〜0(わかりませんが、これは、lowpが実際に2または-2に正確に到達する値を表すことができるとは期待できないことを意味します。これをテストするための優れた方法を知っており、これらの制限に過度に懸念する必要はありません。これが問題になる可能性がある場合は、mediumpを使用してください)
    • 中:精度= 10、範​​囲= 15〜15(仕様に準拠)
    • 高:精度= 23、範囲= 127〜127(仕様を超える)
  • Ints
    • 低:範囲= 23〜23(仕様を超える)
    • 中:範囲= 23〜23(仕様を超える)
    • 高:範囲= 23〜23(仕様を超える)

A7およびPowerVR G6430(iPad Air):

  • フロート
    • 低:精度= 10、範​​囲= 15〜15(仕様を超える)
    • 中:精度= 10、範​​囲= 15〜15(仕様に準拠)
    • 高:精度= 23、範囲= 127〜127(ES 2.0仕様を超え、3.0仕様を満たします)
  • Ints
    • 低:範囲= 15〜14(仕様を超える)
    • 中:範囲= 15〜14(ES 2.0仕様を超え、ES 3.0仕様を満たします)
    • 高:範囲= 31〜30(ES 2.0仕様を超え、ES 3.0仕様を満たします)

A8およびPowerVR GX6450(iPhone 6 Plus):

  • フロート
    • 低:精度= 10、範​​囲= 15〜15(仕様を超える)
    • 中:精度= 10、範​​囲= 15〜15(仕様に準拠)
    • 高:精度= 23、範囲= 127〜127(ES 2.0仕様を超え、3.0仕様を満たします)
  • Ints
    • 低:範囲= 15〜14(仕様を超える)
    • 中:範囲= 15〜14(ES 2.0仕様を超え、ES 3.0仕様を満たします)
    • 高:範囲= 31〜30(ES 2.0仕様を超え、ES 3.0仕様を満たします)

以下は、値をクエリする方法の例です。

int range[2], precision;
glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, range, &precision);
NSLog(@"Fragment shader high precision float range: %d %d precision: %d", range[0], range[1], precision);
glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_MEDIUM_FLOAT, range, &precision);
NSLog(@"Fragment shader medium precision float range: %d %d precision: %d", range[0], range[1], precision);
glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_LOW_FLOAT, range, &precision);
NSLog(@"Fragment shader low precision float range: %d %d precision: %d", range[0], range[1], precision);

glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_HIGH_INT, range, &precision);
NSLog(@"Fragment shader high precision int range: %d %d precision: %d", range[0], range[1], precision);
glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_MEDIUM_INT, range, &precision);
NSLog(@"Fragment shader medium precision int range: %d %d precision: %d", range[0], range[1], precision);
glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_LOW_INT, range, &precision);
NSLog(@"Fragment shader low precision int range: %d %d precision: %d", range[0], range[1], precision);

glGetShaderPrecisionFormat(GL_VERTEX_SHADER, GL_HIGH_FLOAT, range, &precision);
NSLog(@"Vertex shader high precision float range: %d %d precision: %d", range[0], range[1], precision);
glGetShaderPrecisionFormat(GL_VERTEX_SHADER, GL_MEDIUM_FLOAT, range, &precision);
NSLog(@"Vertex shader medium precision float range: %d %d precision: %d", range[0], range[1], precision);
glGetShaderPrecisionFormat(GL_VERTEX_SHADER, GL_LOW_FLOAT, range, &precision);
NSLog(@"Vertex shader low precision float range: %d %d precision: %d", range[0], range[1], precision);

glGetShaderPrecisionFormat(GL_VERTEX_SHADER, GL_HIGH_INT, range, &precision);
NSLog(@"Vertex shader high precision int range: %d %d precision: %d", range[0], range[1], precision);
glGetShaderPrecisionFormat(GL_VERTEX_SHADER, GL_MEDIUM_INT, range, &precision);
NSLog(@"Vertex shader medium precision int range: %d %d precision: %d", range[0], range[1], precision);
glGetShaderPrecisionFormat(GL_VERTEX_SHADER, GL_LOW_INT, range, &precision);
NSLog(@"Vertex shader low precision int range: %d %d precision: %d", range[0], range[1], precision);

精度の低いタイプを選択することで具体的なパフォーマンスの向上が期待できるかどうかはまだわかりません(現在3年前の一部の電話でも)。

最近のGPUが8ビットタイプを完全に排除し、mediumpのものをlowpにリサイクルしていることがわかるように、傾向はデスクトップハードウェアとの収束に向かっていることは明らかです。

15
Steven Lu