Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 10, 2025 03:36

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: uint32 zu float casten?
BeitragVerfasst: Sa Feb 07, 2009 21:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Weiß jemand ob man im Shader effizient einen unsigned int zu einem float casten kann und umgekehrt?

( Integer-Arithmetik für Shader und Texturen ist ein Feature von ShaderModel 4.0 bzw. EXT_gpu_shader4 und EXT_texture_integer )

Also ich meine nicht sowas wie
Code:
  1. unsigned int i = 42;
  2. float f = float(i);

sondern wirklich brutales casten ohne Hirn (:P)
Code:
  1. unsigned int i = 42;
  2. float f = *((float*)(&i));


Da beides 32bit sind und ich die Werte sonst nirgendwo brauche sollte das eigentlich gehen.

Ich benötige das ganze für folgendes Problem:
Mein Fragmentshader produziert zwei Werte die in ein Framebuffer-Object geschrieben werden sollen:
  • einen Index, also ein unsigned int
  • eine Entfernung (nicht der normale Depth-Wert), also einen float

Da ich später beim Lesen im Geometryshader am Limit der möglichen Texturzugriffe (bei mir 32) arbeite sollte beides nach Möglichkeit in eine Textur gerendert werden.

Also Notlösung könnte ich den Index auch in zwei Floats packen oder den Float-Wert mit dem Integer quantisieren (*), aber ideal wäre so ein casten. Kennt sich da zufällig jemand aus?


(*) einfach so:
unsigned int output = unsigned(floatWert / MAX_VALUE * 4294967295.0);

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 07, 2009 22:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zumindest in DirectX (HLSL) scheint es irgendwie zu gehen (letzter Absatz):
http://msdn.microsoft.com/en-us/library ... 85%29.aspx

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 12, 2009 19:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ich habe gerade raus gefunden, dass ich gar nicht den vollen Integer-Range benötige. Werte zwischen 0 und 2^20-1 reichen mir. Eben weil float nun eine 23bit Mantisse hat, kann ich den Integer verlustfrei als float speichern.

Trotzdem wäre es natürlich interessant zu wissen, ob man wie oben beschrieben einen reinterpret-cast machen kann.

Hier ein kleines Testprogramm:
Code:
  1. #include <iostream>
  2.  
  3. int main(int argc, char** argv) {
  4.     // 4194304 == 2048 * 2048
  5.     for (unsigned int u=0; u<4194304; ++u) {
  6.         float f = ((float)u) / 4194304.0f;
  7.         unsigned int w = (unsigned)(f * 4194304.0f);
  8.         if (w != u) {
  9.             std::cout << "eaks!\n";
  10.             return 0;
  11.         }
  12.     }
  13.     std::cout << "done!\n";
  14.     return 0;
  15. }

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 12, 2009 20:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hmm... Wo ich jetzt weiter drüber nachdenke würde es mich wundern. Floats können nicht alle Werte annehmen, die mit 32bit möglich sind. Einige sind NaNs (Not A Number - sehr einfallsreich finde ich ;) ). Diese würden OpenGL bestimmt in verlegenheit bringen.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 12, 2009 21:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Floats können nicht alle Werte annehmen, die mit 32bit möglich sind.

Das spielt keine Rolle, wenn ich den Integer als Float speichere braucht der ja nicht irgendeinen sinnvollen Wert haben. Ich will nur später die Bits wieder zurück casten können.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 19 Queries | GZIP : On ]