2017-01-27 3 views
3

이 문제는 지식이 부족하기 때문에 소프트웨어를 크게 잠그는 glsl 120 (OpenGL 2.1)에 있어야합니다. 기본적으로 440 개의 셰이더에서 많은 기능이 필요합니다. 120, shader5를 사용하여 그것을 잘 커버 지원되는 하드웨어에, 그러나 shader4에 대한 맥 및 다른 것들 IE 메사 나는 많은 기능을 직접해야합니다. 하지만 잔소리를 계속하는 사람들은 제 비트 관련 기능입니다. 나는 비트를 추적하는 것이 좋지 않으므로 도움이 될 것입니다. 문제가있는 가장 큰 함수는 intBitsToFloat 및 floatBitsToInt입니다. 몇 가지 시도를했지만 성공하지 못했습니다. 셰이더에서 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; 
} 

뭔가하는 uint를 위해 변경해야 할 경우 내가 알려, 모든 변형이

을 감상 할 수있다.

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 compat로 빌드 된 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