Opengl es 如何使用GLSL和OpenGLES2.0从整数中获取位

Opengl es 如何使用GLSL和OpenGLES2.0从整数中获取位,opengl-es,glsl,Opengl Es,Glsl,我有一个整数值,想要得到一个位,它被放置在一个特殊的位置上。我正在为OpenGLES2.0使用GLSL 大概是这样的: GetBitOnLocation(int value, int location) { bit myBit = value[location]; if (myBit == 0) return 0; if (myBit == 1) return 1; } 根据前面的评论,不要这样做 ES 2硬件不需要本机支持整数;允许将它们模拟为浮点。为了实现这一点

我有一个整数值,想要得到一个位,它被放置在一个特殊的位置上。我正在为OpenGLES2.0使用GLSL

大概是这样的:

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

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

ES 2硬件不需要本机支持整数;允许将它们模拟为浮点。为了实现这一点,没有定义直接位测试

如果你非常绝望,使用mod和step。例如,要测试整数值的第三位:


逻辑是将要测试的位随机移动到0.5位置,然后用mod将其上方的所有位切断。然后,只有设置了所需的位,您的值才能大于或等于0.5。

根据前面的注释,不要这样做

ES 2硬件不需要本机支持整数;允许将它们模拟为浮点。为了实现这一点,没有定义直接位测试

如果你非常绝望,使用mod和step。例如,要测试整数值的第三位:


逻辑是将要测试的位随机移动到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;
}

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

// 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;
}

一般来说,你不想这样做;GPU在整型位损坏方面往往很弱,从性能角度来看,强迫GPU对数百万个碎片或上万个顶点执行此操作通常是个坏主意;GPU在整型位损坏方面往往很弱,从性能角度来看,强迫GPU对数百万个碎片或上万个顶点执行此操作通常是个坏主意。如果这样做有效,我会感到惊讶,据我所知,GLSL ESA至少用于OpenGL ES 2.0的版本不支持逐位运算符。GLSL ES 2.0不允许逐位运算符。如果这起作用,我会感到惊讶,据我所知,GLSL ESA至少用于OpenGL ES 2.0的版本不支持位运算符。GLSL ES 2.0不允许位运算符。如果需要第三个以外的位,请将8.0更改为2^位置。e、 g:2^4=16.0表示第四位…如果您想要第三位以外的另一位,请将8.0更改为2^位置。e、 第四位的g:2^4=16.0。。。
// 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;
}