DGL
https://delphigl.com/forum/

2x 16bit float in 32bit float packen
https://delphigl.com/forum/viewtopic.php?f=20&t=10543
Seite 1 von 1

Autor:  Thmfrnk [ Fr Aug 03, 2012 11:10 ]
Betreff des Beitrags:  2x 16bit float in 32bit float packen

Hallo,

wie der Titel bereits sagt, versuche ich eine Möglichkeit 2x 16bit Floats in einen 32Bit wert zu packen und diesesn im Shader wieder auseinander zu pflücken..

Ich schiebe via TBOs (RGBA32) werte in den GeometryShader (siehe Partikel Thread), da brauch ich nun noch ein paar mehr werte, wollte aber nicht noch einen Buffer binden.

Habt ihr da was für mich?

Grüße
Thomas

Autor:  Coolcat [ Fr Aug 03, 2012 17:21 ]
Betreff des Beitrags:  Re: 2x 16bit float in 32bit float packen

Möglichkeit 1:
Du benutzt RGBA16 und liest im Shader einfach zwei Zellen aus dem TBO statt eine. Wenn die Zellen nebeneinander liegen sollte der zweite Zugriff gecacht sein und entsprechend schnell.

Möglichkeit 2:
ShaderModell 4 unterstützt Bit-Operationen. Aber leider kann GLSL keinen brutalen Cast von Integer nach Float, die Daten werden immer interpretiert. (HLSL kann das AFAIK). Du musst also von Hand die Bits zerflücken um deinen Float zu rekonstruieren. Wenn du einen beschränkten Wertebereich hast (etwa 0...1) ist es vielleicht besser das als Integer darzustellen statt Float.
Code:
  1. uvec4 input = texelFetchBuffer(...);
  2. uvec4 lower = input & 0xFFFF;
  3. uvec4 higher = input >> 16;

Nun hast du die Float-Daten als Integer. Der Aufbau eines Half-Floats nach IEEE 754-2008 sieht so aus:
Bit 1: Vorzeichen
Bit 2-6: Exponent
Bit 7-16: Mantisse
Dank der vielen Spezialfälle (Subnormal numbers, Infinitiy, ...) will man das eigentlich nicht wirklich selbst in Software-Implementieren ;)

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/