Unity 4.3 enthält eine Vielzahl von Verbesserungen. Eines der vollständig neu implementierten Subsysteme ist das Occlusion Culling. Neben der Vereinfachung der Oberfläche und der Überarbeitung der Culling Runtime selbst wurden auch eine Reihe neuer Funktionen hinzugefügt.

swidt community tool

In einer kleinen Serie von Beiträgen werden wir erläutern, wie das neue Occlusion Culling System in Unity 4.3 funktioniert. Dieser erste Beitrag geht durch die Grundlagen, wie das Entfernen von Occlusions durchgeführt wird und wie die grundlegende Verwendung mit der Benutzeroberfläche sich gestaltet. Der zweite Beitrag konzentriert sich auf Best Practices, um das Beste aus dem Occlusion Culling herauszuholen. Der dritte und letzte Beitrag konzentriert sich auf einige häufige Problemszenarien und deren Lösung.

Aber lassen Sie uns mit einigen Grundlagen beginnen. Unter Occlusion Culling versteht man das Entfernen aller Objekte, die hinter anderen Objekten verborgen sind. Das bedeutet, dass keine Ressourcen für versteckte Dinge verschwendet werden, was zu schnelleren und besser aussehenden Spielen führt. In Unity wird das Occlusion Culling von einer Middleware-Komponente mit der Bezeichnung Umbra durchgeführt, die von Umbra Software entwickelt wurde. Die Benutzeroberfläche, von der aus Umbra in Unity gesteuert wird, finden Sie unter Window > Occlusion Culling unter dem Tab Bake.

Wie Umbra funktioniert.

Der Prozess des Occlusion Culling bei Umbra kann grob in zwei verschiedene Phasen unterteilt werden. Im Editor verarbeitet Umbra die Spielszene so, dass Sichtbarkeitsabfragen in der Spiellaufzeit, im Player durchgeführt werden können. Daher muss Umbra zunächst die Spielszene als Input nehmen und sie in eine leichte Datenstruktur überführen. Während des Bakens voxelt Umbra zuerst die Szene, gruppiert dann die Voxel zu Zellen und kombiniert diese Zellen mit Portalen. Diese Daten werden in Unity neben einigen anderen wichtigen Bits auch als Occlusion Data bezeichnet.

Zur Laufzeit führt Umbra dann die Rasterung des Softwareportals in einem Depth Buffer durch, gegen den die Objektvisibilität getestet werden kann. In der Praxis gibt Unity Umbra eine Kameraposition und Umbra gibt eine Liste der sichtbaren Objekte zurück. Die Sichtbarkeitsabfragen sind immer konservativ, was bedeutet, dass falsche Negative nie zurückgegeben werden. Andererseits können einige Objekte von Umbra als sichtbar angesehen werden, auch wenn sie in Wirklichkeit nicht sichtbar erscheinen.

Es ist wichtig zu wissen, dass dieses System sehr stark an das ähnelt, was mit früheren Unity-Versionen ausgeliefert wurde, aber das gesamte System grundsätzlich neu geschrieben wurde. Vieles hat sich zum Besseren verändert, sowohl intern als auch extern.

Wie Sie Umbra verwenden können.

Es gibt offensichtlich ein paar Überlegungen, um das Beste aus dem Occlusion Culling herauszuholen. Im Idealfall sollten Sie so schnell wie möglich das am wenigsten konservative Ergebnis erzielen. Es gibt jedoch Kompromisse. Je genauer (d.h. am wenigsten konservative) Ergebnisse Sie wünschen, desto höher aufgelöste Daten müssen Sie generieren. Allerdings sind höher aufgelöste Daten in der Laufzeit langsamer zu durchqueren, was zu einer langsameren Abschaffung der Occlusion führt. Wenn das Entfernen von Occlusions mehr Zeit in Anspruch nimmt, als es durch das Entfernen von Occlusions einspart, macht es offensichtlich nicht viel Sinn. Andererseits ist ein sehr schnelles Culling nicht sehr hilfreich, wenn nur wenige Objekte gecullt werden. Es ist also ein Balanceakt.

Umbra ermöglicht es ihnen, diese Balance zu kontrollieren, indem Sie ein paar Baking-Parameter definieren. Die Parameter bestimmen, welche Art von Input der Baking-Prozess erwarten soll und welche Art von Daten erzeugt werden. In der Laufzeit ist die Verwendung von Umbra so einfach wie nie zuvor. Wenn Sie Occlusion-Daten gebakt haben und die Kamera das Occlusion Culling im Inspektor aktiviert hat, verwendet Unity Umbra automatisch.

Kleinste Loch.

Die Eingabe wird mit dem kleinsten Lochparameter gesteuert. Beim Voxifizieren der Okkludergeometrie bildet das kleinste Loch fast direkt auf die Voxelgröße ab. Das bedeutet, dass, wenn ihre Geometrie absichtliche Löcher, Spalten oder Risse enthält, die Sie durchschauen möchten, die Verwendung eines kleinsten Lochs, das kleiner als diese ist, eine gute Idee ist. Auf der anderen Seite enthält die Geometrie oft viele unbeabsichtigte Risse, die man nicht durchschauen möchte. Eine vernünftige Voxelauflösung wird diese beheben. Es kann helfen, über das kleinste Loch als „Eingabeauflösung“ des Bakens nachzudenken.

Beachten Sie, dass das Setzen des kleinsten Lochs in einen lächerlich kleinen Wert bedeutet, dass das Baken inakzeptabel langsam sein wird und/oder eine enorme Menge an Speicherplatz im Editor beansprucht. In einigen seltenen Fällen kann es sogar dazu führen, dass der Baking-Vorgang aufgrund von unzureichenden Speicherplatz fehlschlägt. Andererseits, während die Verwendung eines größeren Wertes schneller und speicherfreundlicher ist, kann es dazu führen, dass Umbra Dinge wie Gitter oder Zäune nicht durchschaut. So größer ist auch nicht immer besser. Im Allgemeinen ist ein möglichst kleines Loch ohne sichtbare Fehler wünschenswert. In der Praxis haben wir festgestellt, dass Werte zwischen 5 cm und 50 cm für die meisten Spiele, bei denen die Skala „menschenähnlich“ ist, ziemlich gut funktionieren. Der Standardwert in Unity ist 25 cm und es ist ein guter Ausgangspunkt.

Kleinste Okkluder.

Während sich das kleinste Loch meist damit beschäftigt, welche Art von Eingangsgeometrie Sie haben, bestimmt der kleinste Okkluder, welche Art von Ausgangsdaten erzeugt werden. Im Wesentlichen können Sie an den kleinsten Okkluder als Ausgabeauflösung der Daten denken. Je größer der Wert, desto schneller ist es, Occlusion Cullings in der Laufzeit durchzuführen, jedoch auf Kosten einer erhöhten Konservativität. Je kleiner der Wert, desto genauer werden die Ergebnisse erzeugt, allerdings auf Kosten von mehr CPU-Zeit. Offensichtlich bedeuten höher aufgelöste Daten auch eine größere Größe der Occlusion-Daten.

Wie die Bezeichnung schon aussagt, bedeutet ein kleiner Wert, dass sehr feine Merkmale in den Occlusion-Daten erfasst werden. Unter der Haube wird direkt darauf abgebildet, wie große Zellen Umbra erzeugt. Viele kleine Zellen bedeuten viele kleine Portale zwischen ihnen und natürlich ist es teurer, eine große Anzahl kleiner Portale zu rasterisieren als umgekehrt.

Die Auswirkungen der Veränderung des kleinsten Okkluders sind im unteren Bild zu sehen. Beachten Sie, wie der Depth Buffer, der im Wesentlichen das ist, was Umbra sieht, mit zunehmender Größe des kleinsten Okkluders an Details verliert.

In den meisten Spielen ist es eine gute Vorgabe, den kleinsten Okkluder etwas größer als den Spieler zu halten. Daher kann ein Abstand zwischen 2 und 6 Metern sinnvoll sein, wenn die Größe ihres Spiel nicht mikroskopisch oder galaktisch ist. Der Standardwert in Unity ist 5 Meter.

Backface Threshold.

Der vielleicht schwierigste Parameter, der zu erfassen ist, nennt sich Backface Threshold. Während Sie es in vielen Fällen nicht wirklich ändern müssen, gibt es einige Situationen, in denen es nützlich sein kann, zu verstehen, wie es sich auf die erzeugten Daten auswirkt.

Zunächst ist es wichtig zu beachten, dass der Parameter nur für einen einzigen Zweck existiert: die Optimierung der Occlusion-Datengröße. Das bedeutet, dass Sie, wenn ihre Datengröße für die Occlusion in Ordnung ist, wahrscheinlich einfach den Schwellenwert für die Rückfläche ganz ignorieren sollten. Zweitens wird der Wert als Prozentsatz interpretiert, so dass ein Wert von 90 90 Prozent bedeutet und so weiter.

Also was macht das Backface Threshold nun wirklich? Stellen Sie sich eine typische Szene vor, die hauptsächlich auf festen Objekten besteht. Darüber hinaus kann es ein Terrain Mesh geben, dessen Normalität nach oben zeigt. Wo sollte sich ihre Kamera in einer solchen Szene befinden? Sicherlich nicht unter dem Terrain, das ist sicher. Außerdem möchten Sie wahrscheinlich auch nicht, dass sich ihre Kamera in festen Objekten befindet (ihre Kollisionserkennung kümmert sich normalerweise darum). Diese ungültigen Stellen sind auch solche, von denen Sie dazu neigen, meist rückwärts gerichtete Dreiecke zu „sehen“ (obwohl die natürlich rückseitig beschädigt werden können). In vielen Fällen kann man also davon ausgehen, dass jeder Ort in der Szene, von dem aus die Kamera viele nach hinten gerichtete Dreiecke sieht, ein „ungültiger“ ist, was bedeutet, dass die In-Game-Kamera nie an diesen Orten landen wird.

Der Parameter für das Backface Threshold hilft ihnen, diese Tatsache zu nutzen. Durch die Definition einer Grenze, wie viel rückwärtige Geometrie von jedem gültigen Kameraplatz aus zu sehen ist, ist Umbra in der Lage, alle Positionen von den Daten, die diesen Schwellenwert überschreiten, zu entfernen. Wie das in der Praxis funktioniert, ist, dass Umbra einfach eine Zufallsstichprobe in allen Zellen durch Herausschießen von Strahlen durchführt und dann sieht, wie viele dieser Strahlen auf nach hinten gerichtete Dreiecke treffen. Wenn der Schwellenwert überschritten wird, kann die Zelle aus den Daten gelöscht werden. Es ist wichtig zu beachten, dass nur Okkluder zum Backface Test beitragen und das Facing von Okkludern keine Relevanz hat. Ein Wert von 100 deaktiviert den Rückwandtest insgesamt.

Wenn Sie also den Backface Threshold z.B. für Umbra als 70 definieren, bedeutet dies, dass alle Stellen in der Szene, von denen über 70% der sichtbaren Okkludergeometrie nicht zur Kamera zeigen, von den Occlusion-Daten entfernt werden können, da die Kamera in Wirklichkeit nie dort landen wird. Es ist natürlich nicht notwendig, das Occlusion Culling von unterhalb des Terrains aus korrekt durchzuführen, da die Kamera sowieso nicht da sein wird. In einigen Fällen kann dies zu ziemlich signifikanten Einsparungen bei der Datenmenge führen.

Es ist wichtig zu betonen, dass das Entfernen dieser Stellen von den Occlusion-Daten bedeutet, dass das Occlusion Culling an diesen Stellen undefiniert ist. „Undefiniert“ bedeutet in diesem Zusammenhang, dass die Ergebnisse korrekt, falsch oder fehlerhaft sein können. Im Falle eines Fehlers werden alle Objekte einfach Frustum geholt.

Natürlich gibt es in einigen Fällen zufällig auch eine gewisse Menge an rückwärtiger Geometrie an gültigen Kamerapositionen. Es kann ein einseitiges Mesh geben, das, möglicherweise fälschlicherweise, als Okkluder gekennzeichnet wurde. Wenn es sich um ein großes Gerät handelt, kann es den Auslöser für den Backface Test Trigger in nahegelegenen Bereichen verursachen, was zu Artefakten führt. Aus diesem Grund handelt es sich um den Standardwert des Backface Thresholds in Unity 10.

Sie können gerne mit dem Parameter experimentieren. Versuchen Sie, den Wert auf 90 zu reduzieren, was z.B. viele Daten unter Gelände fallen lassen sollte. Sehen Sie, wie sich dies spürbar auf die Datengröße der Occlusion auswirkt. Sie können noch tiefer gehen, wenn Sie möchten. Denken Sie nur daran, dies auf eigene Gefahr zu tun. Wenn Sie anfangen, in Rendering-Artefakte zu springen, erhöhen Sie den Wert wieder auf 100 und prüfen Sie anschließend, ob es die Probleme aus der Welt schafft.

Im einem weiteren Beitrag werden wir auf einige Best Practices und Empfehlungen eingehen, wie man optimale Ergebnisse aus dem Occlusion Culling herausholt.

Vielen Dank für ihren Besuch.