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