GLSL ES 2.0(用于iPhone / iPod touch / iPad)的高浮点精度是多少?

问题描述 投票:31回答:3

我有一个着色器,理想情况下需要28位尾数,尽管我可以减少使用并降低性能。如何确定OpenGL ES中“ highp”的精度?它可能是FP24,尾数为16位,但我不能确定或如何询问OpenGL。有什么想法吗?

iphone opengl-es glsl
3个回答
12
投票

您希望GetShaderPrecisionFormat查询着色器类型的范围和精度

int range[2], precision;
glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, range, &precision);

将为您提供上浮的范围和精度。


34
投票

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

15
投票

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

对于整数和浮点型,片段着色器和顶点着色器的精度和范围都相同。

因此,我不会详尽列出所有组合。

还请注意,将int的精度定义为始终为0。

PowerVR SGX543MP3(iPhone 5):

  • Floats >>
    • 低:精度= 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):
    • Floats >>
      • 低:精度= 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):
    • Floats >>
      • 低:精度= 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

    © www.soinside.com 2019 - 2024. All rights reserved.