Behandle viele Lichter in einer Szene (mit Shadern)

9

Ich bin gespannt, wie ich mit vielen Lichtern in einer Szene umgehen soll. Angesichts einer sehr großen Karte in einem Rollenspiel, mit Dungeons (mit Lichtern) usw. Ich weiß über verzögerte Beleuchtung Bescheid, aber das beantwortet nur, wie man viele Lichter rendert. Aber meine Frage ist mehr: Wie man nicht viele Lichter rendert. Es ist natürlich wünschenswert, nur die Lichter zu rendern, die die Szene beeinflussen, aber ich kenne keine Technik / keinen Algorithmus, um dies zu archivieren. Niemand will oder kann 500 Punktlichter rendern, nur weil es irgendwo auf der Karte ist. Man kann aber nicht einfach eine gerade Linie vom Licht zum Spieler nehmen und testen, ob etwas dazwischen liegt. Die Entfernung scheint auch kein guter Indikator zu sein. (Sonnenlicht?)

tl; dr: Wie kann ich herausfinden, welche Lichter die Szene beeinflussen, um sie nur zu rendern?

blubb
quelle
OpenGL oder DirectX?
Kravemir
6
Tatsächlich wären 500 Lichter mit verzögerter Beleuchtung durchaus möglich, solange Sie nicht für alle Schatten wollen;)
Zum Beispiel können Sie für Punkt- und Kegelligts Okklusions-Culling verwenden - Punktlicht ist nur eine Kugel. Richtungslicht ist von überall zu sehen
Kikaimaru
4
@ Darkwings Du beschreibst hier im Grunde, wonach blubb gefragt hat. Wie gehe ich? Nun, ich denke, die Lösung hier ist nur zu Fuß! (Hat für mich gearbeitet.) ;-) "Sie müssen wissen, ob diese Quelle etwas aus Ihrer Sicht beleuchtet." <- Genau darum bittet er, er will wissen, wie er das machen kann. ^^ Obwohl das Kegel / Kugel-Ding von Kikaimaru wahrscheinlich hilfreich ist.
cooky451
1
Für das OP war es nicht offensichtlich, den Sichtstumpf zu überprüfen, da er nur die Entfernung erwähnte. Jedes Licht hat einige Parameter, um dies zu bestimmen. Wenn Richtungslichter verwendet werden, erreichen sie überall, Scheinwerfer haben eine Zielzone (so dass dies mit einem Schnittpunkt zwischen Vektor und Ebene gelöst werden könnte) und so weiter. Sie sollten mehr über die Linien nachdenken, von denen Sie die Szene beeinflussen möchten , da Sie, wenn Sie wirklich viele Lichter wirklich nahe beieinander haben, besser annähern sollten (für Schattenwurf). IE: 100 Kerzen auf einem antiken Kronleuchter können als ein einziges Licht behandelt werden.
Darkwings

Antworten:

5

Noch einfacher als das Begrenzen von Volumes;

Weisen Sie jedem Licht einen Radius zu. Überprüfen Sie beim Rendern Ihrer Szene einfach, ob der Abstand zwischen Ihren Szenenobjekten und jedem Licht kleiner als der Radius des Lichts ist. Wenn ja, verwenden Sie das Licht, andernfalls überspringen Sie es.

Nur ein Bruchteil komplizierter, je nachdem, wie wichtig Leistung ist:

Damit können Sie auch eine Art umfassende Phasenprüfung durchführen. Definieren Sie einfach ein räumliches Raster, in dem Ziehpunkte für Ihre Lichter auf Rasterzellenbasis gespeichert werden, und führen Sie dann nur die Entfernungsprüfung für Lichter durch, die sich in den Zellen innerhalb des maximalen Radius Ihrer Szenenobjekte befinden.

Schaum
quelle
5
+1 - Klingt verdächtig nach einer Begrenzungskugel;)
Gyan alias Gary Buyn
Ein bisschen spät ... jedenfalls ist das genau eine Grenzkugel. Mit dieser Methode rendern Sie immer noch Lichter, die vollständig von Wänden usw. verdeckt sind und daher für die Szene nicht relevant sind. Auch geht nicht jedes Licht in jede Richtung.
Darkwings
5

Der einfachste Weg, den ich mir vorstellen kann (seien wir ehrlich, der einzige Weg, an den ich gedacht habe), besteht darin, jedem Licht ein begrenzendes Volumen zu geben . Wenn sich das Begrenzungsvolumen mit dem Sichtstumpf (oder einem Begrenzungsvolumen des Sichtstumpfs) schneidet, wenden Sie das Licht an.

Es kann immer noch Lichter geben, die angewendet werden, obwohl sie keine sichtbaren Objekte beeinflussen, aber es ist einfach und schnell. Eine intelligente Anordnung Ihres Szenendiagramms kann bedeuten, dass nur wenige Kreuzungsprüfungen die meisten Ihrer Lichter aussortieren (genau wie beim Objekt-Keulen).

So etwas wie die Sonne könnte kein Begrenzungsvolumen haben (um anzuzeigen, dass es immer angewendet werden sollte).

Gyan alias Gary Buyn
quelle