glsl float cast转换为int

时间:2015-12-25 03:28:09

标签: android opengl-es glsl

片段着色器代码:

myJsonString = [
    [
        {"_id":"5668d142a54cc4960b55ea19","cid":10851045,"temp":25.4},
        {"_id":"5668d14ea54cc4960b55ea1a","cid":10850909,"temp":24.9}
    ],
    [
        {"_id":"5668d14fa54cc4960b55ea1b","cid":10851045,"hum":37.9},
        {"_id":"5668d3108c8cda92074b7ec9","cid":10850909,"hum":39.6}
    ],
    [
        {"_id":"5668d3198c8cda92074b7ecb","cid":10851045,"lux":34},
        {"_id":"5668d31e8c8cda92074b7ecc","cid":10850909,"lux":68}
    ]
];

如果我使用varying vec2 v_texCoord; // no use uniform sampler2D uInputTex; // no use highp float xxx = 3025.0; void main() { int ixxx = int(xxx); if (ixxx == 3024) { gl_FragColor = vec4(1.0); } else { gl_FragColor = vec4(0.0); } } 来声明highp,我会得到正确的结果。 如果我只使用默认精度,只需ixxx我将int ixxx = int(xxx);ixxx进行比较是正确的,我将3024ixxx进行比较也是正确的。为什么?

1 个答案:

答案 0 :(得分:0)

这归结为浮点存储差异。 GLSL规范(第4.5节)仅规定了有关浮点精度的要求,但鼓励使用IEEE格式。假设这是驱动程序存储数字的方式,在IEEE格式中,许多值无法准确表示,因为存储是固定数量的位(例如,有关IEEE 754的深入描述,请参阅https://en.wikipedia.org/wiki/Single-precision_floating-point_format 32比特浮动)。

您的文字将是可以表示的最接近的值。这可能略高于实际值。由于您(可能并且可能)更改存储中的位数,因此可能是一位数的表示高于(例如,高位),另一位高于字面值(例如,使用mediump) 。从浮点数构造int时,会发生截断 - 因此,如果文字表示低于3025.0(例如3024.9999 ..),则变为3024.

有几种可能的解决方案,可能最简单的就是直接使用int。您还可以“碰撞”文字数字,以确保它不会被截断(例如,使其成为3025.1,在任何合理的表示中将被截断为3025)。

相关问题