Modelkoordinaten normiert speichern oder nicht?

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
Lichtweite
Beiträge: 16
Registriert: 24.11.2012, 06:41

Modelkoordinaten normiert speichern oder nicht?

Beitrag 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.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Modelkoordinaten normiert speichern oder nicht?

Beitrag 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!
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Lichtweite
Beiträge: 16
Registriert: 24.11.2012, 06:41

Re: Modelkoordinaten normiert speichern oder nicht?

Beitrag 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.
Antworten