GLSL ES 2.0(适用于iPhone/iPod touch/iPad)中highp浮动的精度是多少?
我有一个着色器,理想情况下需要28位尾数,尽管我可以使用较少的尾数并降低性能。如何确定OpenGL ES中“highp”的精度?它可能是一个FP24,有16位尾数,但我不能确定或者如何询问OpenGL。有什么想法吗?您想让GetShaderPrecisionFormat查询着色器类型的范围和精度吗GLSL ES 2.0(适用于iPhone/iPod touch/iPad)中highp浮动的精度是多少?,iphone,opengl-es,glsl,Iphone,Opengl Es,Glsl,我有一个着色器,理想情况下需要28位尾数,尽管我可以使用较少的尾数并降低性能。如何确定OpenGL ES中“highp”的精度?它可能是一个FP24,有16位尾数,但我不能确定或者如何询问OpenGL。有什么想法吗?您想让GetShaderPrecisionFormat查询着色器类型的范围和精度吗 int range[2], precision; glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, range, &p
int range[2], precision;
glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, range, &precision);
将为您提供highp float的范围和精度。来自:
-16位,浮点范围: -2^62到2^62,整数范围:-2^16到2^16highp
-10位,浮动 点范围:-2^14到2^14,整数 范围:-2^10到2^10mediump
-8位, 浮点范围:-2到2, 整数范围:-2^8到2^8低电平
- 浮动
- 低:精度=8,范围=0到0(不确定,但我认为这意味着我们不能期望
实际能够表示精确达到lowp
或2
的值,我真的不知道有什么好的方法来测试这一点,也不应该过度关注这些限制,只要在可能出现问题时使用-2
)mediump
- 中等:精度=10,范围=15至15(符合规范)
- 高:精度=23,范围=127至127(超出规格)
- 低:精度=8,范围=0到0(不确定,但我认为这意味着我们不能期望
- Ints
- 低:范围=23至23(超出规格)
- 中等:范围=23至23(超出规格)
- 高:范围=23至23(超出规格)
- 浮动
- 低:精度=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规范)
- 浮动
- 低:精度=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
您的意思是glGetShaderPrecisionFormat
?glGetShaderPrecisionType
似乎是一个输入错误。glGetShaderPrecisionFormat
当然可以,所以也许你应该编辑你的回复来修正打字错误,我可以把它标记正确。只是为了让下一个家伙更容易。谢谢你的回答!哎哟——是的,更像是一个脑残而不是打字错误——只是记错了名字,在检查规格时看得不够仔细……另一个小错误是e代码:范围应该是长度为2的整数数组。结果是一样的。什么决定精度类型?它依赖于操作系统吗?依赖于GPU吗?它是否因编程语言或OpenGL版本而异?这是标准要求的最低精度。它也是PVR SGX GPU使用的实际精度吗?不是。在我的设备上,numBER看起来是31位、15位和8位。可能是32位、16位和8位。我不知道最后一位到哪里去了。不管类型如何,整数似乎是24位。我不想挑剔,但GLSL不要求任何关于表示低p
、中ump
或高p
所需位数的要求,只有最小值um值和精度范围。因此对于lowp
浮点值,我们有一个[-2.0,2.0]的保证范围精度为2.0^-8,但这并不是说系统使用多少位来表示它。如果highp
的规格是+/-2^16个整数,那么这不意味着它有16位尾数,并且它的位数比总数还要多吗?