Schattenabbildung
Einführung
Shadow-Mapping ist eine gängige Technik, um Echtzeit-Schatten in einer 3D-Szene zu erzeugen. Dabei wird eine Tiefenkartentextur aus der Perspektive der Lichtquelle gerendert. Beim Schattieren eines Pixels eines 3D-Modells wird dessen Tiefenwert dann mit der Tiefenkarte verglichen und dunkler schattiert, wenn es im Schatten liegt, oder heller, wenn es vom Licht beleuchtet wird.
Schatten tragen zum wahrnehmbaren Realismus einer Szene bei und erleichtern die Beurteilung der relativen Positionen von Objekten.

Beachten Sie, dass es in der linken Szene des Bildes unmöglich ist, zu erkennen, wie weit die Objekte von der Ebene entfernt sind, während dies in der rechten Szene dank der Schatten leicht zu erkennen ist.
Qt bietet Unterstützung für Shadow Mapping für alle drei Lichttypen: „ DirectionalLight “, „ PointLight “ und „ SpotLight “. Um Schatten in Ihrer Szene zu aktivieren, müssen Sie zunächst das Licht so einstellen, dass es Schatten wirft, indem Sie „ castsShadow “ auf „ true “ setzen. Anschließend können Sie steuern, welche Modelle Schatten werfen und empfangen, indem Sie „ castsShadows “ und „ receivesShadows “ auf „ true “ bzw. „ false “ setzen.
Richtungslichter
Das gerichtete Licht strahlt in eine Richtung von einer nicht identifizierbaren Quelle aus, die sich unendlich weit entfernt befindet. Dies ähnelt der Funktionsweise des Sonnenlichts im realen Leben. Ein gerichtetes Licht hat eine unendliche Reichweite und nimmt nicht ab.
Kaskadierte Schattenkarten
Ein Problem bei einer „ DirectionalLight “ ist, dass sie die gesamte Szene aus der Perspektive der Lichtquelle rendert. Dies kann zu blockartig aussehenden Schatten führen, wenn die Größe der Shadowmap nicht ausreichend ist. Eine Möglichkeit, eine bessere Renderqualität zu erzielen, ist die Verwendung von „Cascaded Shadow Maps“ (CSM). Qt unterstützt eine CSM-Variante namens „Parallel Split Shadow Maps“ (PSSM). Bei PSSM wird der Sichtkegel in mehrere Teile aufgeteilt und für jeden Teil eine eigene Schattenkarte gerendert.

Dieses Bild zeigt eine abstrakte Darstellung eines Sichtkegels mit PSSM-Aufteilungen. Es gibt zwei Aufteilungen, die zu drei Kaskaden führen.
Auf diese Weise lässt sich eine höhere Shadowmap-Auflösung näher an der Kamera erzielen, wo die visuelle Qualität stärker ins Auge fällt, und eine niedrigere Auflösung weiter von der Kamera entfernt, wo die visuelle Qualität weniger auffällt.

Das obige Bild zeigt eine Schattenkarte ohne Aufteilungen (links) und eine Schattenkarte mit 3 Aufteilungen (rechts).
Die Anzahl der Kaskadenteilungsebenen lässt sich über die Eigenschaft „ csmNumSplits “ steuern, und die Positionen der Teilungsebenen über die Eigenschaften „ csmSplit1 “, „ csmSplit2 “ und „ csmSplit3 “. Um ansprechende Übergänge zwischen den Teilungsebenen zu erzielen, können Sie mit der Eigenschaft „ csmBlendRatio “ einen bestimmten Überblendungsgrad zwischen ihnen festlegen.

Das obige Bild zeigt eine vergrößerte Ansicht einer Kaskadennaht, bei der kein Überblenden aktiv ist.
Beachten Sie, dass die Anwendung für jede hinzugefügte Teilung eine weitere Schattenkarte rendern muss, was sich negativ auf die Leistung auswirkt. Die Größe des Überblendungsbereichs beeinflusst die Leistung; halten Sie ihn daher so klein wie möglich.
Punktlicht
Die „ PointLight “ lässt sich als Kugel beschreiben, die von ihrem Zentrum aus bis zu einem bestimmten Radius in alle Richtungen Licht mit gleicher Stärke ausstrahlt. Dies ähnelt der Art und Weise, wie eine Glühbirne Licht ausstrahlt.

Die „ PointLight “ rendert ihre Schattenkarte in eine Cubemap, was bedeutet, dass sechs Renderdurchgänge erforderlich sind. Dies kann einen erheblichen Rechenaufwand verursachen.
Spotlight
Der „ SpotLight “ strahlt Licht in einer kegelförmigen Form in eine Richtung aus, die durch die Eigenschaft „ coneAngle “ definiert wird. Die Lichtintensität nimmt ab, je näher man dem „ coneAngle “ kommt. Der Winkel, ab dem die Lichtintensität abzunehmen beginnt, wird durch „ innerConeAngle “ definiert. Dies ähnelt der Art und Weise, wie eine Taschenlampe oder ein Scheinwerfer Licht ausstrahlt.

Im Gegensatz zum „ PointLight “ rendert der „ SpotLight “ seine Schattenkarte in eine einzige Tiefenkarte.
Leistung und Szenenoptimierung
Zwar versucht Qt, sinnvolle Standardwerte für die Eigenschaften im Zusammenhang mit dem Shadowmapping bereitzustellen, doch ist es in der Regel erforderlich, diese an die jeweilige Szene anzupassen. Dies gilt insbesondere dann, wenn Ihre Szene deutlich kleiner oder größer ist als erwartet. Im folgenden Abschnitt wird näher darauf eingegangen, wie Sie die Werte anpassen können, damit die Schattenkarte gut aussieht und gleichzeitig eine möglichst gute Leistung gewährleistet bleibt.
Shadow Bias
Shadow bias ist eine Methode, um sogenannte „Shadow Acne“ zu beseitigen – das sind falsche Schatten, die typischerweise in bestimmten Mustern auftreten. Shadow Bias versetzt die Tiefentextur der Schattenkarte so, dass Schatten weiter vom schattenspendenden Objekt entfernt erscheinen, wodurch das Problem der „Shadow Acne“ oft behoben wird. Der Nachteil ist, dass bei einem zu hohen Shadow Bias ein Effekt namens „Peter Panning“ auftreten kann, bei dem der Schatten zu weit vom schattenspendenden Objekt entfernt ist. Es ist auch möglich, Schattenakne durch eine Erhöhung der Shadow-Map-Auflösung zu reduzieren.

Das obige Bild zeigt eine Szene mit einem „Shadow Bias“ von 0 (links) im Vergleich zu einem „Shadow Bias“ von 10 (rechts). In der linken Szene sind einige falsche Schatten auf den Spitzen der Kegel und Zylinder zu sehen.
Auflösung der Schattenkarte
Die Auflösung bzw. Qualität der Schattenkarte wird durch die Eigenschaft „ shadowMapQuality “ gesteuert. Eine höhere Schattenkartenqualität verringert die Blockbildung der Schatten, ist jedoch rechenintensiver; stelle sie daher so niedrig wie möglich ein, ohne dabei die erforderliche visuelle Qualität zu beeinträchtigen.

Das obige Bild zeigt eine Szene mit niedriger Schattenkarte-Auflösung im Vergleich zu einer hohen Schattenkarte-Auflösung.
Qualität der weichen Schatten
Weiche Schatten sind eine Methode, um das Aussehen von Schatten in der Realität nachzubilden, bei dem sie an den Rändern von hart zu weich übergehen. Die Qualität der weichen Schatten wird über die Eigenschaft „ softShadowQuality “ gesteuert. Sie unterstützt sowohl harte Schatten ohne Weichzeichnung als auch weiche Schatten mit prozentualer Nahbereichsfilterung (PCF) in unterschiedlicher Qualität. Harte Schatten lassen sich am kostengünstigsten rendern, während PCF mit steigender Qualität immer rechenintensiver wird. Um den Radius des weichen Schattens zu steuern, verwenden Sie die Eigenschaft „ pcfFactor “. Der Wert von „ pcfFactor “ hat keinen Einfluss auf die Rendergeschwindigkeit, aber je höher er ist, desto höher muss die Qualität der weichen Schatten sein, damit sie gut aussehen.

Das obige Bild zeigt links eine Szene mit einem softShadowQuality Light.Hard -Schatten und rechts eine Szene mit einem softShadowQuality Light.PCF32 sowie einem pcfFactor 10 .
Entfernung der Schattenkarte
Mit der Eigenschaft „ shadowMapFar “ lässt sich die maximale Entfernung der Schattenkarte steuern. Diese Eigenschaft funktioniert bei „ PointLight “ und „ SpotLight “ etwas anders als bei „ DirectionalLight “.
Bei „ PointLight “ / „SpotLight “ bestimmt sie, wie groß die Begrenzungsbox des gerenderten Schattens sein soll, während sie bei „ DirectionalLight “ festlegt, wie weit von der Kamera der Szene entfernt die Schattenkarte in der Szene reichen soll.

Das obige Bild zeigt dieselbe Szene mit demselben gerichteten Licht, jedoch mit zwei unterschiedlichen Werten für „ shadowMapFar “.
Bit-Tiefe der Schattenkarte
Es gibt bestimmte Szenarien, in denen eine sehr große Szene dazu führt, dass die Schattenkarte einen großen Bereich entlang ihrer Tiefenachse abdeckt. Dies ist beispielsweise der Fall, wenn sich viele Objekte weit entfernt vom Kamerablickfeld befinden, die dennoch Schatten werfen und in den Begrenzungsbereich der Schattenkarte einbezogen werden müssen. In diesem Fall kann es vorkommen, dass die Szene selbst bei einem höheren Wert für „ shadowBias “ immer noch Streifenartefakte aufweist. Eine Möglichkeit, dies zu beheben, besteht darin, eine 32-Bit-Tiefe für die Schattenkarte zu verwenden. Durch Setzen der Eigenschaft „ use32BitShadowmap “ auf „ true “ wird dies für das jeweilige Licht aktiviert.

Das obige Bild zeigt dieselbe Szene mit demselben gerichteten Licht, wobei in einem Fall eine 32-Bit-Shadowmap und im anderen Fall eine 16-Bit-Shadowmap verwendet wird.
Siehe auch „Verwendung von bildbasierter Beleuchtung“, „Lightmaps und globale Beleuchtung“ sowie „Qt Quick 3D – Beispiel für kaskadierte Shadowmaps“.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.