gon*_*ive 29 iphone opengl-es glsl
我有一个理想情况下需要28位尾数的着色器,尽管我可以使用更少并降低性能.如何确定OpenGL ES中'highp'的精度?它可能是一个FP24,有16位尾数,但我无法确定或如何询问OpenGL.有任何想法吗?
Bra*_*son 32
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 ^ 8Ste*_* Lu 15
在我的昂贵玩具系列测试中:
所以我不会详尽地列出所有组合.
另请注意,整数的精度定义为始终为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);
Run Code Online (Sandbox Code Playgroud)
我还不清楚你是否可以通过选择低精度类型来获得切实的性能提升(甚至在一些现在已经使用3年的手机上).
很明显,但趋势是与台式机的硬件融合,因为它可以看出,近期的GPU已经完全淘汰了8种类型和被回收mediump药粥lowp.
Chr*_*odd 12
您希望GetShaderPrecisionFormat查询着色器类型的范围和精度
int range[2], precision;
glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, range, &precision);
Run Code Online (Sandbox Code Playgroud)
将为您提供highp float的范围和精度.