Viel zu viele Drawcalls wegen Lightmapping
Verfasst: 19.01.2016, 02:49
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?
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?