Viel zu viele Drawcalls wegen Lightmapping

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Degenerated
Beiträge: 10
Registriert: 19.11.2015, 00:04

Viel zu viele Drawcalls wegen Lightmapping

Beitrag von Degenerated »

Hallo alle zusammen!

Meinem Projekt geht es gerade ziemlich mies, was Performance angeht. Schuld daran ist höchstwahrscheinlich, dass ich plötzlich ca. 36.000 DrawCalls pro Frame tätige.
Ich arbeite gerade an einer Grafikmod zu Gothic 2, damit man sich eher ein Bild darum machen kann, worum es geht.

Dort gibt es ein statisches World-Mesh, bei dem es sich wirklich nur um die Levelgeometrie handelt. Dieses ist intern aus einer Liste an Polygonen zusammengesetzt, welche dann in einem BSP-Tree verteilt werden. Jedem Polygon kann nun eine Lightmap zugewiesen werden. Das kann aber nur passieren, wenn sich das Polygon in einem Innenraum befindet.

Der Einfachheit halber (und weil der von Gothic generierte BSP-Tree wirklich merkwürdig ist, habe ich dieses World-Mesh in einem Quad-Tree aufgeteilt, in dessen Leafs nach Material und Lightmap sortiert die einzelnen Stücke liegen. Da die außenwelt keine Lightmaps hat, gibt es also einen Haufen an Stücken, die keine Lightmap benutzen und dann immer einige, die eine brauchen.

Was ich nicht bedacht habe: Jedes mal, wenn ein Stück eine Lightmap braucht, kann man es nicht mit den anderen Stücken zeichnen, die vielleicht die selbe Textur brauchen, da ja vielleicht eine Lightmap verwendet wird. Kurzum: Man hat einen Haufen an kleinen (oft < 5 Triangles) Stücken, die zwar alle die selbe Textur, aber andere Lightmaps brauchen.
Soweit ich weiß benutzt jeder Innen-Sektor seine eigene Lightmap und eben diese Sektoren werden wiederum von Portalen getrennt.

Ich könnte nun anfangen alle Texturen in Arrays zu packen, was sich aber ziemlich schwierig gestalten sollte, da ich nicht direkt Zugriff auf den Ladevorgang der Texturen habe. Außerdem muss man das wohl auch irgendwie anders machen können, da es ja vor D3D10 noch gar keine TextureArrays gab! Vielleicht wurden dort einfach Textur-Atlanten benutzt?

Was könnte ich also machen, damit mir meine DrawCalls nicht in die höhe schießen? Hat irgendjemand vielleicht eine Idee?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4855
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Viel zu viele Drawcalls wegen Lightmapping

Beitrag von Schrompf »

Einen Texture Atlas. Aus heutiger Sicht ist es gut möglich, dass das alles auf eine große Textur passt und Dein Problem ist erledigt. Dann reservierst Du noch einen kleinen Bereich mit "neutraler" LightMap und mappst alle Außenwelten da drauf, und schon kannst Du alles mit einem DrawCall machen. Erfordert natürlich den Zugriff auf all diese Daten, also könnte das ein organisatorisches Problem werden, wenn ich Dich richtig verstehe.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Degenerated
Beiträge: 10
Registriert: 19.11.2015, 00:04

Re: Viel zu viele Drawcalls wegen Lightmapping

Beitrag von Degenerated »

Einen Textur-Atlas zu benutzen war definitiv die richtige Idee. Die Lightmaps sind größtenteils quadratisch in 256x256 mit nur einer Mip, also war es nicht schwierig dafür einen Atlas zu programmieren. Für die Hauptwelt passt also alles recht entspannt auf eine 4096x4096-Textur, wobei unten noch massig Platz bleibt.

Das rettet meine FPS an der schlimmsten Stelle von ca. 24 auf ~100 zurück! Vielen dank für den Tipp!
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: Viel zu viele Drawcalls wegen Lightmapping

Beitrag von xq »

Schön! Lass mal Bilder davon sehen, bin gespannt, wie sich das vergleicht... :)
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Degenerated
Beiträge: 10
Registriert: 19.11.2015, 00:04

Re: Viel zu viele Drawcalls wegen Lightmapping

Beitrag von Degenerated »

Naja, viel zu sehen gibt es da leider nicht. Es sieht halt aus wie Gothic II, nur eben mittels D3D11 gerendert. Hier hat aber jemand ein Video mit einer der Versionen gemacht, die es gab bevor ich neu angefangen habe: https://www.youtube.com/watch?v=SdqXup3-CQQ

Ist schon etwas weiter gewesen, nur eher eine Art Spielewiese um erstmal einiges zu testen und mit der alten Engine klar zu kommen.
Antworten