Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GLSL ES 2.0(适用于iPhone/iPod touch/iPad)中highp浮动的精度是多少?_Iphone_Opengl Es_Glsl - Fatal编程技术网

GLSL ES 2.0(适用于iPhone/iPod touch/iPad)中highp浮动的精度是多少?

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

我有一个着色器,理想情况下需要28位尾数,尽管我可以使用较少的尾数并降低性能。如何确定OpenGL ES中“highp”的精度?它可能是一个FP24,有16位尾数,但我不能确定或者如何询问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^16
  • mediump
    -10位,浮动 点范围:-2^14到2^14,整数 范围:-2^10到2^10
  • 低电平
    -8位, 浮点范围:-2到2, 整数范围:-2^8到2^8

在我对昂贵玩具系列的测试中:

对于int和float,片段着色器和顶点着色器的精度和范围相同。 因此,我不会详尽列出所有组合

还要注意,ints的精度定义为始终为0

PowerVR SGX543MP3(iPhone 5):
  • 浮动
    • 低:精度=8,范围=0到0(不确定,但我认为这意味着我们不能期望
      lowp
      实际能够表示精确达到
      2
      -2
      的值,我真的不知道有什么好的方法来测试这一点,也不应该过度关注这些限制,只要在可能出现问题时使用
      mediump
    • 中等:精度=10,范围=15至15(符合规范)
    • 高:精度=23,范围=127至127(超出规格)
  • Ints
    • 低:范围=23至23(超出规格)
    • 中等:范围=23至23(超出规格)
    • 高:范围=23至23(超出规格)
A7和PowerVR G6430(iPad Air):
  • 浮动
    • 低:精度=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规范)
A8和PowerVR GX6450(iPhone 6 Plus):
  • 浮动
    • 低:精度=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位尾数,并且它的位数比总数还要多吗?