如何使用GLSL和OpenGL ES 2.0从整数中获取一点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用GLSL和OpenGL ES 2.0从整数中获取一点相关的知识,希望对你有一定的参考价值。

我有一个整数值,并希望得到位于特殊位置的位。我正在使用GLSL for OpenGL ES 2.0

像这样的东西:

GetBitOnLocation(int value, int location)
{
  bit myBit = value[location];
  if (myBit == 0)
    return 0;
  if (myBit == 1)
    return 1;
}
答案

根据之前的评论,不要这样做。

ES 2硬件本身不需要支持整数;允许将它们模拟为浮点。为此,未定义直接位测试。

如果你绝对绝望,请使用modstep。例如。测试整数value的第三位:

float bit = step(0.5, mod(float(value) / 8.0, 1.0));
// bit is now 1.0 if the lowest bit was set, 0.0 otherwise

逻辑是要将你要测试的位洗牌到0.5位置然后用mod切断它上面的所有位。那么只有当你想要的位被设置时,你所拥有的值才能大于或等于0.5

另一答案

这是一个使用整数数学的解决方案(注意:不支持负整数)

// 2^x
int pow2(int x){
    int res = 1;
    for (int i=0;i<=31;i++){
        if (i<x){
            res *= 2;
        }
    }
    return res;
}

// a % n
int imod(int a, int n){
    return a - (n * (a/n));
}

// return true if the bit at index bit is set
bool bitInt(int value, int bit){
    int bitShifts = pow2(bit);
    int bitShiftetValue = value / bitShifts;
    return imod(bitShiftetValue, 2) > 0;
}
另一答案
int GetBitOnLocation(int value, int location)
{
    int myBit = value & (1 << location);
    if (myBit == 0)
        return 0;
    else
        return 1;
}

以上是关于如何使用GLSL和OpenGL ES 2.0从整数中获取一点的主要内容,如果未能解决你的问题,请参考以下文章

OPENGL ES 2.0 知识串讲 ——GLSL 语法(II)

OPENGL ES 2.0 知识串讲 ——GLSL 语法(IV)

OPENGL ES 2.0 知识串讲 ——GLSL 语法(IV)

OPENGL ES 2.0 知识串讲 ——SHADER的功能&GLSL语法(I)

OPENGL ES 2.0 知识串讲 ——OPENGL ES 详解I(绑定 SHADER)

OPENGL ES 2.0 知识串讲 ——OPENGL ES 详解I(绑定 SHADER)