Ich möchte zwei Float-Werte in einer einzelnen 32-Bit-Float-Variable speichern. Die Kodierung erfolgt in C#, während die Dekodierung in einem HLSL-Shader erfolgen soll.Speichern von zwei Float-Werten in einer einzelnen Float-Variablen
Die beste Lösung, die ich bisher gefunden haben, ist, Festverdrahtung der Offset der dezimalen in den codierten Werten und als ganze Zahl und decimal des „carrier“ float Speicherung:
123.456 -> 12.3 and 45.6
Es kann‘ t behandeln negative Werte, aber das ist in Ordnung.
Allerdings habe ich mich gefragt, ob es einen besseren Weg gibt, dies zu tun.
EDIT: Noch ein paar Details über die Aufgabe:
ich mit einer festen Datenstruktur in Unity bin zu arbeiten, wo die Scheitelpunktdaten als Schwimmer gespeichert sind. (Float2 für ein UV, float3 das Normale und so weiter.) Offensichtlich gibt es keine Möglichkeit, zusätzliche Daten richtig hinzuzufügen, also muss ich innerhalb dieser Grenzen arbeiten, deshalb dachte ich, dass alles auf ein allgemeineres Problem der Kodierung von Daten zurückzuführen ist . Zum Beispiel könnte ich die sekundären UV-Daten opfern, um die 2x2 zusätzlichen Datenkanäle zu übertragen.
Das Ziel ist Shader Model 3.0, aber ich hätte nichts dagegen, wenn die Decodierung auch auf SM2.0 funktioniert.
Datenverlust ist in Ordnung, solange es "vernünftig" ist. Der Erwartungswertbereich ist 0..64, aber wie ich jetzt denke, ist es 0..1. Das wäre auch in Ordnung, denn das ist billig, wenn man innerhalb des Shaders einen Bereich neu zuordnen möchte. Wichtig ist, die Präzision so hoch wie möglich zu halten. Negative Werte sind nicht wichtig.
@ZoltanE: Kennen Sie die Bereiche der Variablen, die Sie verschlüsseln möchten? –
@ZoltanE: Auf welches Shader-Modell und welche Version von DirectX zielen Sie? Kannst du mehr darüber erzählen, warum du so verschlüsselst? Schließlich: Überlege dir, ob du auf der [gamedev] (http://gamedev.stackexchange.com/) -Seite nachfragen kannst, du könntest bessere Antworten erhalten. –
Vielleicht könnte die Frage http://stackoverflow.com/questions/4811219/pack-four-bytes-in-a-float Ihnen helfen. – Gnietschow