android - glsl float 转换为 int

标签 android opengl-es glsl

fragment 着色器代码:

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); 我比较 ixxx3024 是正确的,我比较 ixxx3025 也是正确的。为什么?

最佳答案

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

您的文字将改为可以表示的最接近的值。这可能略高于实际值。由于您(可能并且很可能)正在更改存储中的位数,因此可能一个位数的表示高于(例如使用 highp),而另一个低于文字值(例如使用 medimp) .当从 float 构造 int 时,会发生截断 - 因此如果字面量表示低于 3025.0(例如 3024.9999..),它将变为 3024。

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

关于android - glsl float 转换为 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34459779/

相关文章:

android - 使用六边形图像随机生成图案

android - 如何通过API获取用户的用户名和密码在GitHub上注册?

c# - 使用 Assimp 在 OpenGL (GLSL) 中进行骨骼动画

c++ - GLSL 停止渲染

运行 64 位操作系统的 64 位操作系统上的 android studio 给出错误 : 32-bit Linux Android emulator binaries are DEPRECATED

java - 如何无意识地传递对象

android - 包装的 android-app 在恢复 "no current context"时崩溃

javascript - 在 ThreeJs 中围绕中心点上下移动 3D 相机

java - Android OpenGL ES 1.x 中绘制临时对象的最佳方式

opengl - 使用 OpenGL 着色语言进行选择