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);
[D3D11] 2 Shorts in Float packen [gelöst]
-
- Beiträge: 49
- Registriert: 09.01.2003, 13:04
[D3D11] 2 Shorts in Float packen [gelöst]
Zuletzt geändert von Unknown GER am 20.04.2010, 22:30, insgesamt 2-mal geändert.
- Schrompf
- Moderator
- Beiträge: 5162
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: [D3D11] 2 Shorts in Float packen
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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- Krishty
- Establishment
- Beiträge: 8350
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [D3D11] 2 Shorts in Float packen
uint a = asuint(ab) >> 16;
uint b = asuint(ab) & 0xFFFF;
Für den umgekehrten Weg asfloat().
Gruß, Ky
uint b = asuint(ab) & 0xFFFF;
Für den umgekehrten Weg asfloat().
Gruß, Ky
-
- Beiträge: 49
- Registriert: 09.01.2003, 13:04
Re: [D3D11] 2 Shorts in Float packen
Vielen Dank, genau das hab ich gesucht. :)