Opengl es 如何使用GLSL和OpenGLES2.0从整数中获取位
我有一个整数值,想要得到一个位,它被放置在一个特殊的位置上。我正在为OpenGLES2.0使用GLSL 大概是这样的: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硬件不需要本机支持整数;允许将它们模拟为浮点。为了实现这一点
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;
}