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

gon*_*ive 29 iphone opengl-es glsl

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

Bra*_*son 32

OpenGL ES着色语言参考:

  • 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

  • 我不想挑剔,但GLSL并没有强制要求代表`lowp`,`mediump`或`highp`所需的位数,只有最小值和精度范围.因此对于`lowp`浮点值,我们有[** - 2.0**,**2.0**]的保证范围和**2.0 ^ -8**的精度,但是没有说明有多少位系统用来表示它. (5认同)

Ste*_* Lu 15

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

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

所以我不会详尽地列出所有组合.

另请注意,整数的精度定义为始终为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);
Run Code Online (Sandbox Code Playgroud)

我还不清楚你是否可以通过选择低精度类型来获得切实的性能提升(甚至在一些现在已经使用3年的手机上).

很明显,但趋势是与台式机的硬件融合,因为它可以看出,近期的GPU已经完全淘汰了8种类型和被回收mediump药粥lowp.


Chr*_*odd 12

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

int range[2], precision;
glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, range, &precision);
Run Code Online (Sandbox Code Playgroud)

将为您提供highp float的范围和精度.