Seite 1 von 1

[D3D11] 2 Shorts in Float packen [gelöst]

Verfasst: 20.04.2010, 13:20
von Unknown GER
Hallo,

ich möchte zwei 16-Bit-Integer (unsigned) in einen 32-Bit-Float packen bzw. möchte ich sie in einem Shader aus dem Float entpacken. In älteren Beispielen hab ich HLSL-Code wie diesen gefunden:

float ab;

float a = floor(ab);
float b = frac(ab) * 512 - 256;

Dabei wird ein 8-Bit-Integer (skaliert) im gebrochenen Anteil des Floats gespeichert und auf eben diese Weise wieder entpackt, was für 8 Bit noch gut funktioniert, nicht aber für großartig mehr Bits, für 2x 16 Bit gar unmöglich ist. Gibt es mittlerweile die Möglichkeit, einfach so etwas im (Vertex-)Shader umzusetzen:

unsigned short a = static_cast<unsigned short>(reinterpret_cast<int>(ab) >> 16);
unsigned short b = static_cast<unsigned short>(reinterpret_cast<int>(ab) & 0xffff);

Re: [D3D11] 2 Shorts in Float packen

Verfasst: 20.04.2010, 13:39
von Schrompf
Ab DirectX10 kannst Du ja Integermathematik verwenden. Dann ist Dein float nur noch ein 32Bit-Platz für jeden beliebigen Spaß. Den genauen Syntax kann ich Dir aber nicht sagen... Du willst in dem Fall ja keinen Cast (also Umrechnung), sondern eine Reinterpretation des Wertes.

Re: [D3D11] 2 Shorts in Float packen

Verfasst: 20.04.2010, 15:36
von Krishty
uint a = asuint(ab) >> 16;
uint b = asuint(ab) & 0xFFFF;


Für den umgekehrten Weg asfloat().

Gruß, Ky

Re: [D3D11] 2 Shorts in Float packen

Verfasst: 20.04.2010, 15:59
von Unknown GER
Vielen Dank, genau das hab ich gesucht. :)