我有一个着色器,理想情况下需要28位尾数,尽管我可以减少使用并降低性能。如何确定OpenGL ES中“ highp”的精度?它可能是FP24,尾数为16位,但我不能确定或如何询问OpenGL。有什么想法吗?
您希望GetShaderPrecisionFormat查询着色器类型的范围和精度
int range[2], precision;
glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, range, &precision);
将为您提供上浮的范围和精度。
从OpenGL ES Shading Language reference:
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
。