opengl - 在着色器中,intBitsToFloat和floatBitsToInt

标签 opengl bit-manipulation glsl

所以我遇到的这个问题是缺乏知识,我需要在glsl 120(OpenGL 2.1)中工作,这会严重锁定软件。本质上,我需要120中的440个着色器的许多功能,并在支持的硬件上使用shader5它涵盖了一切,但是在用于Mac和其他东西的shader4上,IE mesa我需要自己做很多功能。但是那些不断困扰我的是我的位相关功能,我在跟踪位方面很不好,所以任何帮助都是很可爱的。我遇到的最大功能是intBitsToFloat和floatBitsToInt,我尝试了一些尝试,但没有成功。

int floatToIntBitst(float a){
    //Nan
    if(a != a) return 0x7fc00000;

    //-0
    if (a == 0.0) return  (1.0 / a == -1.0/0.0 ) ? 0x80000000 : 0;

    bool neg = false;
    if (a < 0.0) {
        neg = true;
        a = -a;
    }

    if (isinf(a)) {
        return neg ? 0xff800000 : 0x7f800000;
    }

    int exp = ((a >> 52) & 0x7ff) - 1023;
    int mantissa = (a & 0xffffffff) >> 29;
    if (exp <= -127) {
        mantissa = (0x800000 | mantissa) >> (-127 - exp + 1);
        exp = -127;
    }
    int bits = negative?2147483648: 0;
    bits |= (exp + 127) << 23;
    bits |= mantissa;

    return bits;
}

我的其他一些功能,任何反馈将不胜感激

bitfieldReverse
int bitfieldReverse(int x) {
    x = ((x & 0x55555555) << 1) | ((x & 0xAAAAAAAA) >> 1);
    x = ((x & 0x33333333) << 2) | ((x & 0xCCCCCCCC) >> 2);
    x = ((x & 0x0F0F0F0F) << 4) | ((x & 0xF0F0F0F0) >> 4);
    x = ((x & 0x00FF00FF) << 8) | ((x & 0xFF00FF00) >> 8);
    x = ((x & 0x0000FFFF) << 16) | ((x & 0xFFFF0000) >> 16);
    return x;
}

我有各种各样的选择,如果需要为单位做些改变,请告诉我。

LSB和MSB
int   findLSB(int x  ) { return x&-x; }

int findMSB(int x) {
    x |= (x >> 1);
    x |= (x >> 2);
    x |= (x >> 4);
    x |= (x >> 8);
    x |= (x >> 16);
    return (x & ~(x >> 1));
}

这些也一样

bitCount
int bitCount(int a) {
    a = (a & 0x55555555) + ((a >>  1) & 0x55555555); 
    a = (a & 0x33333333) + ((a >>  2) & 0x33333333); 
    a = (a + (a >> 4)) & 0x0f0f0f0f; 
    a = (a + (a >> 8)); 
    a = (a + (a >> 16)); 
    return a & 0xff;
}

最佳答案

不提供GL 3.0+的硬件几乎总是那些也没有整数(不同于float)的硬件。因此,您的所有int实际上都是伪装的float。这意味着它们必须遵守float的范围和限制。

因此,您无法有效地在这种硬件上进行尝试的位操作。

关于opengl - 在着色器中,intBitsToFloat和floatBitsToInt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41890919/

相关文章:

java - BigDecimal 最佳编码比例

iphone - GLSL ES 2.0(适用于 iPhone/iPod touch/iPad)中的 highp float 的精度是多少?

java - 如何在LWJGL中将 float 组传递给Shader

opengl - 是否需要glDisableClientState?

opengl - 使用 GLSL 对顶点数组进行广告牌?

c++ - 如何在 OpenGL 中将对象旋转一定度数?是否有内置命令或我必须使用公式?

c - 除法期间 float 的位会发生什么变化?

opengl - 如何对具有透明度的纹理应用蒙版以达到透视效果

performance - 字节数组的快速位移 - CMAC 子 key

java - Android 版 OpenGL ES 2.0 中的纹理