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).