Skip to content

Wie moderne Engines Foliage-Overdraw besiegen

Von Oleg Sidorkin, CTO und Mitgründer von Cinevva

Dichtes Blätterdach mit überlappenden Blattkarten, die sich vor einer untergehenden Sonne hintereinander stapeln und starkes Overdraw veranschaulichen

Ein Wald gehört zu den schlimmsten Dingen, die man eine GPU rendern lassen kann. Jedes Blatt ist ein texturiertes Quad, dessen Form durch eine Alphamaske ausgeschnitten wird. Entlang jedes Sichtstrahls stapeln sich Dutzende dieser Quads übereinander. Der Rasterizer kann nicht im Voraus wissen, welche Fragmente den Alphatest bestehen werden. Daher ist die übliche Early-Z-Optimierung, die bei undurchsichtigen Szenen so viel Leistung spart, weitgehend deaktiviert. Das Ergebnis: Ein einzelnes Bildschirmpixel kann den vollständigen Blatt-Shader 10- oder 15-mal ausführen, bevor das Bild fertig ist. Das ist Foliage-Overdraw – und bei jedem Open-World-Spiel, das im vergangenen Jahrzehnt erschienen ist, ist es der teuerste Einzelposten eines Frames.

Die gute Nachricht: Das Problem ist gelöst. Nicht in dem Sinne, dass es jemand mit einem einzigen Trick behoben hätte, sondern weil es einen Stack aus sieben oder acht Techniken gibt, die das effektive Overdraw in einem dichten Wald gemeinsam vom 8- bis 15-Fachen auf das 1- bis 2-Fache reduzieren. Jede moderne Engine bringt eine Variante dieses Stacks mit. Hier erfährst du, woraus er besteht, warum jeder Baustein nötig ist und welche Referenzen dafür maßgeblich sind.

1. Warum Foliage-Overdraw so schmerzhaft ist

In einer typischen undurchsichtigen Szene führt die GPU eine frühzeitige Tiefenverwerfung durch: Noch bevor der Pixel-Shader ausgeführt wird, prüft die Hardware den vorhandenen Tiefenpuffer und überspringt Fragmente, die bereits hinter etwas anderem liegen. Das ist praktisch kostenlos und hält die Kosten dichter Geometrie im Rahmen.

Foliage mit Alphatest macht diese Optimierung zunichte. Der Fragment-Shader muss tatsächlich ausgeführt werden, um die Alphatextur auszuwerten und für die ausgeblendeten Pixel discard (oder clip) aufzurufen. Die Hardware kann erst nach der Shader-Ausführung wissen, ob ein Fragment verworfen wird. Deshalb deaktiviert die Verwendung von discard an irgendeiner Stelle eines Shaders auf den meisten GPUs Early-Z für den gesamten Draw Call. Auf Tile-basierten GPUs (Mobilgeräte, M-Serie, einige Konsolen) kann sie Hi-Z und die Tiefenkompression sogar für den gesamten Frame deaktivieren. Der Pixel-Shader wird für jedes Dreieck ausgeführt, das ein Pixel bedeckt – und die meisten dieser Auswertungen enden mit einem Discard.

Stapele 10 Blatt-Quads vor einem einzigen Bildschirmpixel, und der Blatt-Shader wird 10-mal ausgeführt. Multipliziert mit 4 Millionen Pixeln sind die Kosten enorm. Marco Salvis Artikel Early-Z oder nicht Early-Z bietet den zugänglichsten Überblick darüber, warum das auf Hardwareebene geschieht. Wenn du dich noch nie damit beschäftigt hast, ist er der richtige Einstieg.

Seitenansicht des Sichtstrahls eines einzelnen Bildschirmpixels, der zwölf überlappende Blattkarten durchquert; jede Karte ist hervorgehoben, um die gestapelten Fragmente mit Alphatest zu zeigen

2. Der Tiefen-Prepass für maskierte Geometrie

Der größte Einzelgewinn – und die Technik, die jede moderne Engine nutzt – besteht darin, das Rendern der Vegetation in zwei Durchgänge aufzuteilen. Der erste Durchgang schreibt ausschließlich Tiefenwerte. Dafür verwendet er einen minimalen Shader, der den Alphatest ausführt, die maskierten Pixel verwirft und sonst nichts schreibt. Der zweite Durchgang rendert das vollständige Material, wobei der Tiefentest auf „gleich“ gesetzt und das Schreiben von Tiefenwerten deaktiviert ist. Nun wird die vollständige BRDF für jedes sichtbare Pixel exakt einmal ausgewertet – unabhängig davon, wie viele Blatt-Quads sich dahinter stapeln.

Das klingt nach doppelter Arbeit, weil dieselben Dreiecke zweimal verarbeitet werden. Der Prepass-Shader ist jedoch so günstig – ein Textur-Sample, ein Discard, ein Tiefenwert –, dass die Einsparungen im Hauptdurchgang die Zusatzkosten bei Weitem übertreffen. In einem dichten Wald wird der vollständige Blatt-Shader im Hauptdurchgang nicht mehr 10- bis 15-mal pro Pixel, sondern genau einmal ausgeführt.

Unreal, Frostbite, Decima sowie die modernen Rage- und Dunia-Zweige nutzen dieses Verfahren. Es ist außerdem der Hauptgrund, warum maskierte Materialien in all diesen Engines weiterhin günstiger sind als transluzente Materialien.

Vertiefende Quellen:

3. Aggressive LODs und oktaedrische Impostors

Der zweitgrößte Gewinn entsteht, wenn Blätter überhaupt nicht gezeichnet werden, sofern es nicht nötig ist. Foliage-Assets werden mit mehreren LOD-Stufen ausgeliefert. Die nächste Stufe ist das vollständige Mesh mit einzelnen Blattkarten. Auf mittlere Entfernung werden die Blätter zu dichteren Verbundkarten zusammengefasst – aus einem Büschel von 30 Blättern wird eine texturierte Karte mit derselben Silhouette. Ab einer bestimmten Entfernung wird der gesamte Baum zu einem Impostor: einem kleinen Geometriestück, das mit vorgerenderten Ansichten des Baums aus vielen Blickwinkeln texturiert ist.

Das moderne Impostor-Format ist der oktaedrische Impostor: ein Geometriestück mit acht Flächen, das mit einem Atlas von Ansichten texturiert wird. Diese Ansichten werden mithilfe oktaedrischer Abbildung von Punkten auf einer Kugel aufgenommen. Zur Laufzeit wählt der Shader anhand der Kamerarichtung die zwei oder drei nächstgelegenen vorgerenderten Ansichten aus und überblendet sie. Das Ergebnis ist ein Ersatzmodell aus wenigen Dreiecken, das aus jedem Winkel dreidimensional wirkt und korrekte Beleuchtung, Normal Maps und sogar Windanimationen unterstützen kann. Ryan Brucks’ Implementierung, ursprünglich ein Community-Plugin und inzwischen Teil von Unreal, gilt als Referenz. Die Milliarden Bäume in Microsoft Flight Simulator sind praktisch überall oktaedrische Impostors – außer in unmittelbarer Kameranähe.

Der größere strukturelle Vorteil besteht darin, dass Impostors auf Distanz undurchsichtig oder nahezu undurchsichtig sind. Die Verbundkarte aus 30 Blättern ist ein einzelnes maskiertes Quad statt 30 Quads. Der Impostor des gesamten Baums besteht aus wenigen Flächen statt aus Tausenden. Das Overdraw im Fernbereich fällt nahezu vollständig weg.

Vertiefende Quellen:

4. Cluster-Culling und GPU-gesteuertes Culling

Selbst mit einem Tiefen-Prepass entstehen durch den Prepass Kosten: Er muss weiterhin jedes Dreieck jedes sichtbaren oder potenziell sichtbaren Baums verarbeiten. Moderne Engines senken diese Kosten mit GPU-gesteuertem Cluster-Culling, das ganze Dreiecksgruppen verwirft, bevor der Rasterizer sie überhaupt sieht.

Die Pipeline sieht so aus: Jedes Mesh wird im Voraus in Cluster aus 64 oder 128 Dreiecken mit einer eng anliegenden Bounding Box und einem Normalenkegel unterteilt. Zur Renderzeit durchläuft ein Compute-Shader die Instanzliste und prüft jede Instanz gegen den Sichtkegel. Anschließend prüft er jedes Cluster jeder sichtbaren Instanz gegen den Sichtkegel und führt danach für jedes verbleibende Cluster einen Hi-Z-Occlusion-Test gegen die Tiefenpyramide des vorherigen Frames durch. Ganze Baumäste, die hinter einem Hügel oder einem anderen Baum verborgen sind, werden entfernt, bevor auch nur ein Vertex-Shader ausgeführt wird. Das Ergebnis ist eine kompakte Liste mit Argumenten nach dem Muster „diese Cluster zeichnen“, die direkt an einen einzigen DrawIndirect-Aufruf übergeben wird.

Dadurch lässt sich ein Wald aus 10.000 Bäumen in Millisekunden statt Sekunden rendern. Ubisofts Vortrag zu Assassin’s Creed Unity führte diese Pipeline in produktionsreifer Form ein: 20–40 % der Dreiecke und 30–80 % der Schattendreiecke wurden entfernt, während zehnmal mehr Instanzen als in der vorherigen Generation auf dem Bildschirm möglich waren. Wihlidals Frostbite-Vortrag entwickelte den Ansatz weiter. UE5 Nanite ist der sichtbare Endpunkt dieser Entwicklung: Cluster-Culling bis hinunter auf Pixelebene.

Vertiefende Quellen:

5. Sortierung von Instanzen und Clustern von vorn nach hinten

Sobald der Prepass seine Aufgabe erfüllt, wird die Reihenfolge wichtig. Der Prepass schreibt Tiefenwerte, aber nur für Fragmente, die den Alphatest bestehen. Wenn du zuerst den hinteren Teil des Waldes und zuletzt den vorderen zeichnest, überschreibt jedes vordere Fragment ein hinteres – und der Prepass-Shader wird für die hinteren Fragmente trotzdem ausgeführt. Beim Zeichnen von vorn nach hinten füllt jeder nachfolgende Draw den Tiefenpuffer mit kleineren Werten. Dadurch verwirft Hi-Z immer mehr der hinteren Fragmente, bevor der Shader ausgeführt wird.

Deshalb sortiert nahezu jede moderne Engine Foliage-Instanzen nach ihrer Entfernung zur Kamera, bevor sie den Prepass ausführt. Die Sortierung ist günstig – einige Hunderttausend Instanzen werden auf der GPU per Radix Sort verarbeitet – und macht den Prepass selbst zu einem Vorgang, der sich fortlaufend beschneidet. Aus demselben Grund sortiert Cluster-Culling auf Meshlet-Ebene. Tiefen-Prepass und Reihenfolge von vorn nach hinten sind ein Technikenpaar, bei dem jede für sich gut funktioniert, die Kombination aber hervorragend ist.

Vertiefende Quellen:

6. Geditherte LOD-Übergänge und Hashed Alpha

Die andere große Falle sind Überblendungen. Der naive Ansatz für den Übergang zwischen zwei LODs – oder zum Ein- und Ausblenden einer Instanz bei Annäherung der Kamera – ist Alpha Blending. Überblendete Geometrie kann jedoch nicht in den Tiefenpuffer schreiben. Dadurch landet jeder überblendete Baum im langsamen Transparenzpfad, und der Prepass funktioniert nicht mehr. Die Lösung besteht darin, die Geometrie im maskierten Pfad zu belassen und die Überblendung innerhalb des Alphatests auszuführen.

Die zwei wichtigsten Techniken:

  • Geditherte LOD-Übergänge verwenden ein 4×4- oder 8×8-Bayer-Muster – oder eine Blue-Noise-Textur im Screen Space – als pixelweisen Modifikator für den Grenzwert. Bei einem Baum mit 50 % Überblendung bleibt ein Schachbrettmuster aus Pixeln erhalten; die fehlenden Pixel werden durch das komplementäre Schachbrettmuster der nächsten LOD-Stufe ergänzt. TAA glättet das Muster über zwei oder drei Frames zu einem weichen Übergang. Das ist günstig, stabil und lässt sich mit allen anderen Engine-Systemen kombinieren.
  • Hashed Alpha Testing (Wyman & McGuire, I3D 2017) ersetzt den festen Alpha-Grenzwert von 0,5 durch einen pixelweisen gehashten Grenzwert im Bereich [0,1). Entfernte Alpha-Geometrie, die normalerweise vollständig verschwinden würde, weil der Mipmap-Alphawert unter 0,5 fällt, behält eine stabile Streuung überlebender Pixel. Auch hier übernimmt TAA die Glättung.

Beide Techniken halten die Vegetation im undurchsichtigen beziehungsweise maskierten Pfad, in dem der Tiefen-Prepass funktioniert. So fallen nicht die vollständigen Kosten des Transparenz-Renderings an, nur um etwas einzublenden. Alpha to Coverage ist der Verwandte derselben Idee aus der MSAA-Ära: Alpha wird in eine Subpixel-Abdeckungsmaske umgewandelt, wodurch partielle Transparenz möglich ist, ohne den maskierten Pfad zu verlassen. Der Haken: A2C spielt seine Stärken nur mit MSAA wirklich aus, das die meisten modernen Deferred Renderer nicht mehr verwenden.

Vertiefende Quellen:

7. Reduzierung der Shading-Kosten maskierter Pixel

Selbst mit einem perfekten Prepass und perfektem Culling muss jedes sichtbare Foliage-Pixel einmal schattiert werden. Engines senken auch diese Kosten:

  • Einfachere BRDF. Laub ist matt und benötigt keinen vollständigen Cook-Torrance-Pfad für spiegelnde Reflexionen. Eine gewrappte Lambert-Diffusion plus eine einzeilige Näherung für spiegelnde Reflexionen reicht völlig aus.
  • Niederfrequentere Normal Maps. Blätter sind ohnehin detailreich. Eine 256x256-Normal-Map sieht bei typischen Betrachtungsabständen genauso aus wie eine mit 1024x1024 und spart Bandbreite.
  • Keine Parallaxe, keine Anisotropie, kein Clearcoat. Für Blätter wird das PBR-Funktionsmenü abgeschaltet.
  • Zweiseitige Dünnschichttransmission statt vollständigem Subsurface Scattering. Blätter lassen Licht von hinten durch, doch das lässt sich mit einem einzigen Skalarprodukt für Gegenlicht simulieren.
  • Shading mit halber Auflösung in manchen Engines. Laub wird mit 1/4 oder 1/2 der Pixelrate schattiert und anschließend hochskaliert. Das stochastische Rauschen von TAA kaschiert die Neuberechnung.
  • Detailtexturen und Decals überspringen bei maskierten Materialien standardmäßig.

Jede dieser Maßnahmen bringt für sich genommen einen kleinen Gewinn. Zusammen können Shader für maskiertes Laub zwei- bis dreimal schneller laufen als das entsprechende opake Material.

Vertiefende Quellen:

8. Visibility Buffer und Nanite für maskierte Materialien

Die sauberste Lösung für Overdraw besteht darin, Shading und Rasterisierung vollständig voneinander zu entkoppeln. Ein Visibility Buffer rasterisiert Geometrie in einen schlanken Puffer – lediglich Dreiecks-ID und Instanz-ID pro Pixel – und führt das vollständige Material anschließend als Deferred-Pass aus, der den Visibility Buffer liest und jedes Pixel genau einmal schattiert. In der Shading-Phase gibt es damit konstruktionsbedingt keinen Overdraw. Das Paper von Burns und Hunt aus dem Jahr 2013 führte dieses Verfahren ein; UE5 Nanite ist dessen produktionsreife Umsetzung, seit UE 5.5 auch für maskiertes Laub.

Der besondere Ansatz von Nanite besteht darin, dies mit virtualisierter Geometrie auf Cluster-Ebene umzusetzen. Dadurch verwendet der Rasterizer für Dreiecke unterhalb der Pixelgröße einen Softwarepfad und hält den Overdraw begrenzt. Maskierte Materialien in Nanite benötigen die Funktion „Programmable Raster“: Der Alpha-Test läuft während des Visibility-Buffer-Passes, doch das Material-Shading erfolgt beim Deferred Resolve weiterhin nur einmal pro sichtbarem Pixel. Dadurch ist sehr dichtes Nanite-Laub, das bei maskierten Materialien einst notorisch langsam war, heute mit opaker Geometrie konkurrenzfähig oder sogar günstiger, weil der Overdraw während des Shadings null beträgt. Es gibt jedoch einen Kompromiss: Oft ist es besser, hochpolygonale opake Baumgeometrie durch Nanite zu schicken, statt niedrigpolygonale Bäume aus maskierten Cards beizubehalten, weil der maskierte Pfad zusätzliche Kosten für Programmable Raster verursacht.

Vertiefende Quellen:

9. Separate Schattendarstellungen für Laub

Shadow Maps für Alpha-getestetes Laub sind nach großen Kaskaden das zweitteuerste Schattenproblem in jedem Open-World-Frame. Jede Kaskade benötigt ihren eigenen Depth-Prepass, jeder Prepass führt den Alpha-Test aus, und bei vier Kaskaden sowie Dutzenden Licht-Frusta summieren sich die Kosten schnell. Daher rendern die meisten Engines Laubschatten nicht auf dieselbe Weise wie die Farbe des Laubs.

Gängige Ersatzverfahren:

  • Mesh-Distance-Field-Schatten (UE Lumen, eigene Engines). Jedes Mesh besitzt ein vorberechnetes vorzeichenbehaftetes Distanzfeld. Ein kurzer Cone Trace durch das SDF erzeugt einen weichen Schatten, ohne jemals das Alpha-getestete Mesh anzutasten. Das eignet sich besonders gut für Bäume, weil das SDF die Silhouette der Baumkrone als einen einzigen festen Körper erfasst und Details einzelner Blätter ignoriert.
  • Kaskaden mit niedrigerer Auflösung für Laub. Laubschatten werden in eine Slice mit halber Auflösung geschrieben und mit kantenbewusster Filterung hochskaliert. Die geringere Auflösung fällt dem Auge nicht auf, weil die Schatten ohnehin weich sind.
  • Alpha-to-Coverage-Shadow-Maps mit MSAA. Bei Engines, die im Schattenpfad noch MSAA verwenden, erzeugt A2C Laubschatten mit weichen Kanten ohne die vollen Kosten eines Alpha-Tests.
  • Kapselschatten für Stamm und große Äste, Distance Fields für die Baumkrone und vollständige Alpha-Tests nur in der nächstgelegenen Kaskade. Unterschiedliche Darstellungen für unterschiedliche Entfernungen, die im Beleuchtungs-Pass ineinander überblendet werden.
  • WPO-Deaktivierungsdistanz. Der windgesteuerte World Position Offset wird ab einem Schwellenwert deaktiviert, damit zwischengespeicherte Schattendaten über mehrere Frames hinweg gültig bleiben. Die Virtual Shadow Maps von UE stützen sich stark darauf.

Vertiefende Quellen:

10. Wind, Animation und Schatten-Caching

Ein damit zusammenhängendes, subtiles Problem: Das meiste Laub bewegt sich. Windgesteuerte Vertex-Animationen – World Position Offset in UE und entsprechende Verfahren in Frostbite und Decima – führen dazu, dass die Laubgeometrie von Frame zu Frame nicht stabil bleibt. Dadurch funktionieren Schatten-Caching und Reprojektion nicht mehr zuverlässig. Moderne Engines wirken dem auf zwei Arten entgegen:

  • WPO mit zunehmender Entfernung begrenzen. Ab einem Schwellenwert wird die Amplitude der Windanimation sanft auf null reduziert. Aus dieser Entfernung kann das Auge die Bewegung ohnehin nicht erkennen, während die Schatten-Caches gültig bleiben.
  • Die Windbewegung in die Cluster-Grenzen einrechnen. Die Bounding Boxes der Cluster werden um den maximalen WPO-Offset erweitert, sodass das Culling konservativ bleibt, ohne dass pro Frame neue Daten hochgeladen werden müssen.
  • Phasenverschiebungen pro Instanz. Identische Bäume verwenden einen zufälligen Seed pro Instanz, um die Windphase zu verschieben. Dadurch schwingt ein Wald nicht im Gleichschritt, ohne dass für jeden Baum eine eigene Animation berechnet werden muss.

Solche Details tauchen in Auflistungen von Techniken kaum auf, machen in der Praxis aber den Unterschied zwischen einem Wald mit 3 ms und einem mit 9 ms Renderzeit aus.

Vertiefende Quellen:

11. Die Gesamtberechnung

Keiner dieser Tricks ist für sich genommen ein Allheilmittel. Interessant ist, was passiert, wenn sie kombiniert werden:

  • Ein naiver Pass für maskiertes Laub erreicht in einer dichten Waldszene einen effektiven Overdraw von 8- bis 15-fach. Jedes sichtbare Pixel führt den Blatt-Shader 8- bis 15-mal aus.
  • Durch einen Depth-Prepass sinkt der Overdraw des Hauptpasses auf etwa 1-fach, doch der Prepass verarbeitet weiterhin alles.
  • Durch Sortierung von vorne nach hinten beginnt der Prepass, sich selbst frühzeitig zu beschneiden.
  • Durch GPU-Culling auf Cluster-Ebene verarbeitet der Prepass nur noch, was überhaupt sichtbar sein könnte.
  • Durch LOD-Ketten und Impostors sinkt die Anzahl sichtbarer Quads jenseits von 30 m um eine Größenordnung.
  • Durch den Visibility-Buffer-/Nanite-Pfad läuft die Shading-Phase selbst bei dichten Überlappungen tatsächlich nur einmal pro Pixel.
  • Durch Distance-Field-Schatten skaliert der Schattenaufwand nicht mehr mit dem Alpha-Test.

Das zentrale Ergebnis, das sich in den oben verlinkten Vorträgen wiederholt: Der effektive Overdraw sinkt von 8- bis 15-fach auf 1- bis 2-fach, und die gesamten Frame-Kosten für Laub fallen in einer dichten Waldszene um den Faktor 4 bis 6. Genau deshalb können moderne Open-World-Spiele auf Consumer-Hardware Wälder mit mehr als 60 fps rendern.

Diagramm der Laub-Rendering-Pipeline als fünf übereinanderliegende Phasen: GPU-Culling, sortierter Prepass, maskierter Farb-Pass mit Depth-Equal, Visibility-Buffer-Shading und separater Distance-Field-Schattenpfad

12. Was das für den Browser bedeutet

Der Großteil dieses Stacks lässt sich direkt auf WebGPU übertragen. GPU-gesteuertes Culling, indirekte Dispatches, Hi-Z-Occlusion und von vorne nach hinten sortierte Prepasses sind in der Open-World-Browser-Engine bereits umgesetzt. Der Depth-Prepass für maskierte Geometrie ist unkompliziert: WebGPU unterstützt Depth-Equal-Tests und discard in Fragment-Shadern, mit denselben Einschränkungen hinsichtlich Early-Z. Oktaedrische Impostors lassen sich mechanisch portieren; mathematisch sind lediglich die Abwicklung von der Kugel auf ein Oktaeder und die Atlas-Indexierung erforderlich.

Schwieriger sind die modernen Komponenten. Ein Visibility Buffer in WebGPU bedeutet, eine 32-Bit-Dreiecks-ID in ein Render Target zu schreiben und die Materialien in einem bildschirmfüllenden Compute-Pass aufzulösen. Die Bausteine sind vorhanden, doch ihre Koordination ist aufwendig. Mesh-Distance-Field-Schatten benötigen eine 3D-Textur pro Asset und einen kurzen Cone Trace; beides liegt im Leistungsumfang von WebGPU. Hashed Alpha und geditherte LODs benötigen jeweils nur eine einzelne Shader-Funktion.

Der weitere Weg für Laub im Browser ist derselbe wie für alles andere in diesem Stack: Zuerst die günstigen, robusten Komponenten ausliefern – Prepass, sortierte Instanzen, LODs, Impostors und Hashed Alpha – und darauf die aufwendigen Verfahren wie Visibility Buffer und Mesh-SDF-Schatten aufbauen. Die Mindestleistung der Browser-Hardware ist endlich hoch genug, dass es keinen architektonischen Grund mehr gibt, warum ein WebGPU-Wald nicht wie auf einer Konsole aussehen und laufen sollte. Es gibt nur noch technische Gründe – und technische Herausforderungen sind genau die Art von Problemen, die wir mögen.

Weiterführende Literatur zum gesamten Stack

Wer eine einzige Quelle sucht, die all diese Themen zusammenführt, findet im SIGGRAPH-Archiv „Advances in Real-Time Rendering in Games“ (advances.realtimerendering.com) die maßgeblichen Vorträge zu Laub und GPU-gesteuertem Rendering bis zurück ins Jahr 2014. Adrian Courrèges’ Artikel über GPU-Profiling enthalten Frame-für-Frame-Analysen von GTA V und Horizon Zero Dawn, die jeden hier behandelten Pass in der tatsächlichen Produktionsreihenfolge zeigen. Speziell zur Mathematik von Alpha-Tests bietet Chris Wymans Forschungsseite die Paper zu Hashed Alpha und stochastischer Transparenz samt Referenz-Shadern. Und die Kapitel der 4. Ausgabe von Real-Time Rendering über Transparenz, Sampling und Depth-Verarbeitung sind weiterhin der ideale Einstieg aus dem Lehrbuch.