Schatten-Mapping

Einführung

Shadow-Mapping ist eine gängige Technik, um einer 3D-Szene Schatten in Echtzeit zu verleihen. Dabei wird eine Tiefenkartentextur vom Standpunkt der Lichtquelle aus gerendert. Wenn dann ein Pixel eines 3D-Modells schattiert wird, wird sein Tiefenwert mit der Tiefenkarte verglichen und er wird dunkler schattiert, wenn er sich im Schatten befindet, oder heller, wenn er vom Licht beleuchtet wird.

Schatten tragen zu einer realistischeren Wahrnehmung einer Szene bei und erleichtern die Beurteilung der relativen Position 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 durch die Schatten leicht möglich ist.

Qt bietet Unterstützung für die Schattenzuordnung für alle drei Lichttypen, DirectionalLight, PointLight und SpotLight. Um Schatten in Ihrer Szene zu aktivieren, müssen Sie zuerst das Licht so einstellen, dass es Schatten wirft, indem Sie castsShadow auf true setzen. Sie können dann steuern, welche Modelle Schatten werfen und empfangen, indem Sie castsShadows und receivesShadows auf true oder false setzen.

Gerichtetes Licht

Das gerichtete Licht strahlt von einer nicht identifizierbaren, unendlich weit entfernten Quelle in eine Richtung ab. Dies ähnelt der Art und Weise, wie das Sonnenlicht im wirklichen Leben funktioniert. Ein gerichtetes Licht hat eine unendliche Reichweite und wird nicht schwächer.

Kaskadierende Schattenkarten

Ein Problem bei DirectionalLight ist, dass die gesamte Szene aus der Sicht des Lichts gerendert wird. Dies kann zu klotzig wirkenden Schatten führen, wenn die Größe der Shadowmap nicht ausreicht. Eine Möglichkeit, eine bessere Rendering-Qualität zu erreichen, ist die Verwendung von Cascading Shadow Maps (CSM). Qt unterstützt eine Version von CSM namens Parallell Split Shadow Maps (PSSM). Bei PSSM wird die Ansichtsfläche in mehrere Teile aufgeteilt und für jeden Teil eine Shadowmap gerendert.

Dieses Bild zeigt ein abstraktes Bild eines View Frustum mit PSSM-Splits. Es hat zwei Splits, die in drei Kaskaden enden.

Auf diese Weise erhalten Sie eine höhere Auflösung der Shadowmap in der Nähe der Kamera, wo die visuelle Qualität besser wahrnehmbar ist, und eine geringere Auflösung in größerer Entfernung von der Kamera, wo die visuelle Qualität weniger auffällig ist.

Das obige Bild zeigt eine Schattenkarte ohne Teilungen (links) und eine Schattenkarte mit 3 Teilungen (rechts).

Sie können die Anzahl der Kaskadenteilungen mit der Eigenschaft csmNumSplits und die Position der Teilungen mit den Eigenschaften csmSplit1, csmSplit2 und csmSplit3 steuern. Um schöne Übergänge zwischen den Teilungen zu erhalten, können Sie mit der Eigenschaft csmBlendRatio einen bestimmten Grad der Überblendung zwischen ihnen festlegen.

Das obige Bild zeigt eine vergrößerte Ansicht einer Kaskadennaht ohne aktive Überblendung.

Beachten Sie, dass die Anwendung für jede hinzugefügte Teilung eine weitere Shadowmap rendern muss, was sich negativ auf die Leistung auswirkt. Die Größe des Überblendungsbereichs wirkt sich auf die Leistung aus, halten Sie ihn daher so klein wie möglich.

Punktlicht

PointLight kann als eine Kugel beschrieben werden, die Licht mit gleicher Stärke in alle Richtungen vom Zentrum des Lichts bis zu einem bestimmten Radius abstrahlt. Dies ist vergleichbar mit der Art und Weise, wie eine Glühbirne Licht abstrahlt.

PointLight rendert seine Shadowmap in eine Cubemap, was bedeutet, dass sechs Renderdurchgänge erforderlich sind. Dies kann recht rechenintensiv sein.

Spot-Licht

Die SpotLight strahlt Licht in eine Richtung in Form eines Kegels ab, der durch die Eigenschaft coneAngle definiert ist. Die Lichtintensität nimmt ab, wenn man sich dem coneAngle nähert. Der Winkel, ab dem die Lichtintensität abnimmt, wird durch innerConeAngle definiert. Dies ist vergleichbar mit der Lichtabgabe einer Taschenlampe oder eines Scheinwerfers.

Im Gegensatz zu PointLight rendert SpotLight seine Schattenkarte in eine einzige Tiefenkarte.

Leistung und Szenenanpassung

Obwohl Qt versucht, vernünftige Standardwerte für die Eigenschaften der Schattenabbildung bereitzustellen, ist es in der Regel notwendig, sie an die jeweilige Szene anzupassen. Besonders wenn die Szene viel kleiner oder größer ist als erwartet. Im folgenden Abschnitt wird genauer beschrieben, wie Sie die Werte anpassen können, damit die Schattenabbildung gut aussieht und gleichzeitig eine möglichst gute Leistung erzielt wird.

Schattenverzerrung

Shadow bias ist eine Möglichkeit, so genannte Schattenakne zu entfernen, d. h. falsche Schatten, die typischerweise in bestimmten Mustern auftreten. Mit der Schattenverzerrung wird die Tiefenstruktur der Schattenkarte so verschoben, dass die Schatten weiter vom schattenwerfenden Objekt entfernt erscheinen, wodurch die Schattenakne oft behoben wird. Der Nachteil ist, dass bei einer zu großen Schattenverzerrung ein Effekt namens "Peter Panning" auftreten kann, bei dem der Schatten zu weit vom schattenwerfenden Objekt entfernt ist. Es ist auch möglich, die Schattenakne zu reduzieren, indem man die Auflösung der Shadowmap erhöht.

Das obige Bild zeigt eine Szene mit 0 Schattenverzerrung (links) und 10 Schattenverzerrung (rechts). Die linke Szene hat einige falsche Schatten auf der Oberseite von Kegeln und Zylindern.

Auflösung der Schattenkarte

Die Auflösung/Qualität der Shadowmap wird durch die Eigenschaft shadowMapQuality gesteuert. Eine höhere Qualität der Shadowmap verringert die Blockigkeit der Schatten, ist aber teurer im Rendering, also stellen Sie sie so niedrig wie möglich ein, ohne die erforderliche visuelle Qualität zu beeinträchtigen.

Das obige Bild zeigt eine Szene mit einer niedrigen Shadowmap-Auflösung im Vergleich zu einer hohen Shadowmap-Auflösung.

Qualität der weichen Schatten

Weiche Schatten sind eine Annäherung an das Aussehen von Schatten im wirklichen Leben, wo sie an den Rändern von härter zu weicher ausfallen. Die Qualität des weichen Schattens wird durch die Eigenschaft softShadowQuality gesteuert. Sie unterstützt sowohl harte Schatten ohne Weichheit als auch weiche Schatten mit prozentualer Filterung (PCF) von unterschiedlicher Qualität. Harte Schatten sind am billigsten zu rendern und PCF wird immer teurer, je höher die Qualität ist. Um den Radius des weichen Schattens zu steuern, verwenden Sie die Eigenschaft pcfFactor. Der Wert von pcfFactor hat keinen Einfluss auf die Rendering-Geschwindigkeit, aber je höher er ist, desto höher muss die Qualität des weichen Schattens sein, um gut auszusehen.

Das obige Bild zeigt eine Szene mit einem softShadowQuality Light.Hard Schatten auf der linken Seite und eine Szene mit einem softShadowQuality Light.PCF32 und pcfRadius 10 auf der rechten Seite.

Shadowmap weite Entfernung

Die Eigenschaft shadowMapFar kann verwendet werden, um den maximalen Abstand der Shadowmap zu steuern. Diese Eigenschaft funktioniert etwas anders für PointLight und SpotLight als für DirectionalLight.

Für PointLight/SpotLight bestimmt sie, wie groß die Bounding Box des gerenderten Schattens sein soll, aber für DirectionalLight definiert sie, wie weit die Schattenkarte von der Kamera der Szene entfernt sein soll.

Das obige Bild zeigt dieselbe Szene mit demselben gerichteten Licht, aber zwei verschiedenen Werten für shadowMapFar.

Siehe auch Verwenden von bildbasierter Beleuchtung und Lightmaps und globaler Beleuchtung.

© 2025 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.