Seite 1 von 1

Modelkoordinaten normiert speichern oder nicht?

Verfasst: 28.11.2012, 19:24
von Lichtweite
Hallo,

ich hoffe ich poste meine Frage im richtigem Forum. Ich bin gerade dabei meine Datenstruktur für meine erste kleine reine Software 3D-Engine zu planen und mir stellt sich die Frage, ob ich die Koordinaten meiner Modelle normiert auf 1 speichern und laden soll, und sie später skaliere oder ob ich gleich mit der richtigen Skalierung arbeiten soll?

Vielleicht könnte mir einer die Vor- und Nachteile der Methoden aus der Praxis erläutern? Ich will die Engine auch FixedPoint freundlich halten, falls dies für die Entscheidung eine Rolle spielt.

Re: Modelkoordinaten normiert speichern oder nicht?

Verfasst: 28.11.2012, 19:50
von Krishty
Rein Software? Hm.

Ich arbeite zwar selber im Augenblick an Festkommaphysik, aber ich weiß nicht, wie es um die momentane Leistung von Integer-SSE steht; darum möchte ich die Leistung mal außen vor lassen.

Wenn man die Verfügbarkeit passender Bibliotheken ebenfalls ignoriert (tan() in Festkomma? Eeeeew!), ist Festkomma definitiv die „richtige“ Wahl. Richtig in dem Sinne, dass es das minimale und einfachste Datenformat ist, das deine Koordinaten halten kann:
  • Du brauchst den hohen Dynamikumfang von Gleitkommazahlen nicht, weil deine Koordinaten eine relative geringe Reichweite haben.
  • Du brauchst die exponentielle Verteilung von Gleitkommazahlen nicht, weil deine Koordinaten relativ gleichverteilt sind.
  • Durch diese Entschlackung kommst du möglicherweise mit 16- oder 8-Bit-Zahlen für deine Koordinaten aus, halbierst oder viertelst also den Speicherbedarf und kannst den Cache-Durchsatz entsprechend erhöhen.
Das nur zu Gleitkomma vs. Festkomma, aber das war ja garnicht deine Frage! Du möchtest die Engine freundlich dafür halten.

Dafür ist die Skalierung definitiv der richtige Weg, weil du sonst
  • entweder ein Festkommaformat bräuchtest, das die Reichweite aller Koordinaten aller Modelle abdeckt (und damit entweder verschwendet oder Verlust verursacht); oder
  • jedem Modell ein eigenes Festkommaformat zuweisen müsstest, was im Grunde dasselbe wie ein Skalierfaktor ist, nur komplizierter und darum nicht erstrebenswert.
Zu guter Letzt: Grafikkarten unterstützen (unsigned) normalized int-Formate (also Q0.8, Q0.16, Q0.32) seit Direct3D 10; ich schicke z.B. meine Koordinaten so zur GPU um Bandbreite zu sparen. Und falls du die Koordinaten in Software verarbeiten willst, solltest du vielleicht auf die Skalierung zu [-1, +1] umsatteln, weil man bei der Berechnung immer mal wieder negative Zahlen (und am besten auch ein zusätzliches Bit!) braucht.

Bedenk, dass du bei Gleitkommazahlen keinen Vorteil aus der Normierung ziehst; wegen der zusätzlichen Rechenoperationen wahrscheinlich sogar eher einen winzigwinzigkleinen Nachteil.

tl;dr: Ja!

Re: Modelkoordinaten normiert speichern oder nicht?

Verfasst: 28.11.2012, 21:23
von Lichtweite
Danke für deine äußerst ausführliche Antwort , du hast mit sehr geholfen. Ich werde deine Vorschlag annehmen und normiert arbeiten. OpenGL oder DirectX sind derzeit noch kein Thema. Ich möchte gerne selbst 3D programmieren und erst danach mich den schon in Hardware fertig implementierten Sachen widmen. Es ist ja auch mehr nur ein Lernprojekt um die 3D-Programmierung von der Pike auf mal selbst gemacht zu haben.