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

时间:2010-12-10 22:54:49

标签: iphone opengl-es glsl

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

3 个答案:

答案 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.

PowerVR SGX543MP3(iPhone 5):

  • 浮筒
    • 低:精度= 8,范围= 0到0(不确定,但我认为这意味着我们不能指望lowp实际上能够表示恰好达到2或{的值{1}},我真的不知道测试它的好方法,我们也不应该过度关注这些限制,只需使用-2这可能是一个问题)
    • 中:精度= 10,范围= 15到15(符合规格)
    • 高:精度= 23,范围= 127到127(超出规格)
  • 整数
    • 低:范围= 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规格)
  • 整数
    • 低:范围= 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规格)
  • 整数
    • 低:范围= 15到14(超出规格)
    • 中:范围= 15到14(超过ES 2.0规范,符合ES 3.0规范)
    • 高:范围= 31到30(超过ES 2.0规范,符合ES 3.0规范)

以下是您可以查询值的示例。

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的范围和精度。