Ich bin gerade dabei herauszufinden, wie ich alle Informationen, die ich für einen physikalisch basierten verzögerten Renderer benötige, in einen G-Puffer packen kann, ohne einen obszönen zu verwenden Anzahl der Renderziele.

Was ich bisher habe, sind 4 dreiteilige Vektoren:

  • Albedo / Diffus
  • Normal
  • Tangente
  • Position

und 4 Einzelkomponenten

  • Metallische
  • Rauheit
  • Höhe
  • Umgebungsokklusion

Ein naiver Ansatz besteht darin, eine der einzelnen Komponenten mit einem der dreiteiligen Vektoren in den Alpha-Kanal (vierten Kanal) zu bündeln. Dies ist meine derzeitige Untersuchungslinie. Angesichts der Tatsache, dass vier 4-Kanal-Gleitkomma-Rendering-Ziele mit voller Genauigkeit nicht „klein“ sind, ist es meines Erachtens üblich, halbe Genauigkeit und noch kleinere Darstellungen zu verwenden, um speicherbewusster zu sein

Was ich frage ist: Welche Komponenten kann ich sicher reduzieren, ohne an Qualität zu verlieren, und um wie viel?

Antwort

Zunächst einmal brauchen Sie überhaupt keine Position im G-Puffer. Die Position eines Pixels kann aus dem Tiefenpuffer rekonstruiert werden, wobei das Kamera-Setup und die xy-Position des Bildschirmraums des Pixels bekannt sind. So können Sie sie entfernen diesen ganzen Puffer.

Außerdem benötigen Sie normalerweise auch keine Tangentenvektoren im G-Puffer. Sie werden nur zum Konvertieren normaler Karten aus dem Tangentenraum und für die Parallaxenabbildung benötigt. Dies erfolgt während des G-Puffer-Fülldurchlaufs (wenn Sie Tangenten aus dem Netz haben, das Sie rendern), und nur für den G-Puffer Speichern von Normalen in der Welt oder im Ansichtsraum.

Materialeigenschaften wie Farben, Rauheit und Metallic sind normalerweise nur 8-Bit-Werte im G-Puffer, da sie aus 8-Bit-Texturen stammen. Gleiches gilt für AO.

Die Höhe wird im G-Puffer ebenfalls nicht benötigt, es sei denn, Sie führen eine davon abhängige Mehrfachdurchlaufmischung durch, aber wenn Sie sie benötigen, sind es wahrscheinlich 8 Bit genug auch dafür.

Normalen können davon profitieren, dass sie als 16-Bit-Werte anstatt als 8-Bit-Werte gespeichert werden. Half-Float ist in Ordnung, aber 16-Bit-Festkomma ist noch besser, da Sie über alle Ausrichtungen hinweg eine gleichmäßigere Präzision erzielen (Half-Float ist in der Nähe der Achsen präziser und verliert etwas an Präzision). Darüber hinaus können Sie sie mithilfe von oktaedrischer Zuordnung von 3 auf 2 Komponenten reduzieren.

Am Ende des Tages also ein Minimum Der G-Puffer könnte folgendermaßen aussehen:

  • Materialfarbe + Metallic: RGBA8
  • Oktaedrischer Weltraumnormal + Rauheit + AO: RGBA16

und das ist alles! Nur 12 Bytes pro Pixel.

Alternativ können Sie einen RG16-Puffer für die Normalen verwenden und die Rauheit + AO in einen separaten 8-Bit-Puffer verschieben Etwas Platz zum Wachsen, falls Sie eventuell mehr G-Puffer-Komponenten mit 8-Bit- oder 16-Bit-Größe benötigen.

Kommentare

  • Auch Metallizität ist häufig ein Binärwert. Unter der Annahme, dass Sie keine Rauheitsgradienten verwenden (um die Auswirkungen einer verringerten Genauigkeit zu sehen), können Sie Metallität und Rauheit in einem einzelnen 8-Bit-Kanal speichern (1 Bit für Metallizität und 7 Bit für Rauheit).

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.