我有一个理想情况下需要28位尾数的着色器,尽管我可以使用更少并降低性能。如何确定OpenGL ES中'highp'的精度?它可能是一个FP24,有16位尾数,但我无法确定或如何询问OpenGL。有什么想法吗?
答案 0 :(得分:32)
来自OpenGL ES Shading Language reference:
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 答案 1 :(得分:15)
在我的昂贵玩具系列测试中:
所以我不会详尽地列出所有组合。
另请注意,整数的精度定义为始终为0.
lowp
实际上能够表示恰好达到2
或{的值{1}},我真的不知道测试它的好方法,我们也不应该过度关注这些限制,只需使用-2
这可能是一个问题)以下是您可以查询值的示例。
mediump
我还不清楚你是否可以通过选择低精度类型(即使在一些现在已经使用3年的手机上)来提高性能。
很明显,趋势是与桌面硬件融合,因为可以看出最近的GPU已经完全消除了8位类型并且正在回收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);
个{ {1}}。
答案 2 :(得分:12)
您希望GetShaderPrecisionFormat查询着色器类型的范围和精度
int range[2], precision;
glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, range, &precision);
将为您提供highp float的范围和精度。