2017-01-27 6 views
3

この問題は知識が不足しているため、ソフトウェアを大きくロックするglsl 120(OpenGL 2.1)にインストールする必要があります。基本的に440シェーダの多くの機能が必要です120でshader5を使って、それをうまくカバーするハードウェアをサポートしていますが、shader4ではmacや他のものをIEメサと呼びます。私は多くの機能を自分でやる必要があります。しかし、私の気持ちを変え続けるものは、私のビット関連の機能です。私はビットを追跡するのが非常に悪いので、どんな助けも素敵です。私が問題を抱えている最大の関数はintBitsToFloatとfloatBitsToIntですが、私はいくつかのことを試みましたが、成功しませんでした。shader 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; 
} 

私の他の機能のいくつかを、任意のフィードバックは何かが私に知らせするuintのために変更する必要がある場合、私は、すべてのバリエーションを持っている

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

同じことがまた、整数を持っていないハードウェアはほとんど常にあるGLの3.0+を提供していませんこれらの

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; 
} 
+4

適切なハードウェアサポートなしでは、実際には 'floatToIntBitst'を実行することはできません。 NaNには通常の算術演算子ではアクセスできないペイロードが含まれていますが、適切な 'IntBitsToFloat <-> floatToIntBits'ラウンドトリップのためにそれを抽出する必要があります。 – ybungalobill

答えて

0

ハードウェアのために行きますfloatとは別の種類です。したがって、intのすべてが実際にはfloatの偽装です。つまり、彼らはfloatの範囲と制限で生きなければならないということです。

このため、このようなハードウェアで試している種類のビット操作を効果的に行うことはできません。

+0

これは本当ですが、ハードウェアが3.0+であることを除けば、コンテキストが120である理由は複雑ですが、330互換で構築されたMacではshader4が実行されています。 https://www.opengl.org/registry/specs/EXT/gpu_shader4.txt – dotModded

+0

@dotModded:しかし...これらの関数はGLSL 3.30の一部です。だから、なぜあなたは明らかにアクセス権を持っているものを再実装するのに気をつけていますか? 3.30へのアクセス権があれば、[ARB_shader_bit_encoding](https://www.opengl.org/registry/specs/ARB/shader_bit_encoding.txt)拡張機能にアクセスできます。したがって、ARB_gpu_shader4が必要な場合は、その拡張も要求する必要があります。 –

+0

MACドライバのため、ARB_shader_bit_encodingは従来のドライバには含まれていないため、Macでは不可能です。 – dotModded