私は理想的には28ビットの仮数を必要とするシェーダーを持っていますが、使用する量が少なくパフォーマンスが低下する可能性があります。 OpenGL ESでの「highp」の精度はどのように判断できますか?それはおそらく16ビットの仮数のFP24ですが、OpenGLに質問する方法や確実な方法がわかりません。何か案は?
GetShaderPrecisionFormatでシェーダータイプの範囲と精度をクエリする
int range[2], precision;
glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, range, &precision);
highp floatの範囲と精度を提供します。
highp
-16ビット、浮動小数点の範囲:-2 ^ 62〜2 ^ 62、整数の範囲:-2 ^ 16〜2 ^ 16mediump
-10ビット、浮動小数点の範囲:-2 ^ 14〜2 ^ 14、整数の範囲:-2 ^ 10〜2 ^ 10lowp
-8ビット、浮動小数点の範囲:-2〜2、整数の範囲:-2 ^ 8〜2 ^ 8私の高価なおもちゃのラインでの私のテストでは:
したがって、すべての組み合わせを完全にリストすることはしません。
また、intの精度は常に0と定義されていることに注意してください。
lowp
が実際に2
または-2
に正確に到達する値を表すことができるとは期待できないことを意味します。これをテストするための優れた方法を知っており、これらの制限に過度に懸念する必要はありません。これが問題になる可能性がある場合は、mediump
を使用してください)以下は、値をクエリする方法の例です。
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
にリサイクルしていることがわかるように、傾向はデスクトップハードウェアとの収束に向かっていることは明らかです。