Schattierung mehrerer Lichter - Ein Durchgang gegen mehrere Durchgänge

7

Ich habe nach Möglichkeiten gesucht, um mehrere Lichtschattierungen zu implementieren, und ich habe festgestellt, dass Unity mehrere Durchgänge verwendet, um dies zu erreichen . Es führt einen Basisdurchlauf durch, um das hellste gerichtete Pixellicht + 4 Scheitelpunktlichter + SHs und einen zusätzlichen Durchgang für jedes Pixellicht bis zu einer vom Benutzer im Editor festgelegten Grenze anzuwenden.

Ich frage mich, da ich vorher weiß, wie viele Pixel Lichter ich schattieren muss, warum nicht in einem einzigen Durchgang, wie es Scheitelpunktlichter tun? Was sind die Probleme dabei?

Felipe Lira
quelle

Antworten:

2

Es ist durchaus möglich, alle Pixellichter im Fragment-Shader (oder beispielsweise 4 gleichzeitig) auszuführen, indem Sie ein Array durchlaufen. Dies ist jedoch mit hohen Leistungskosten verbunden: Sie berechnen die Beleuchtung für jedes Licht in jedem Fragment der Szene, auch wenn diese Geometrie nicht durch den Einfluss des Lichts beeinflusst wird.

Ich vermute, dass dies der Grund ist, warum Unity dies nicht tut: Es wählt wahrscheinlich die Objekte aus und sendet nur Geometrie, die bei jedem Durchgang durch das jeweilige Licht beeinflusst werden könnte, was bedeutet, dass die Schattierung eines Lichts nur in den Fragmenten ausgewertet wird, in denen es möglicherweise vorhanden ist ein Effekt. Dies ist ein Kompromiss zwischen der Verarbeitung weniger Fragmente und der Verdoppelung der Geometriekosten.

Yuriks
quelle
Nun, da Sie das Keulen erwähnt haben, ist dies sehr sinnvoll. Ich habe es gerade überprüft und es gibt eine Culling-Masken-Eigenschaft in hellen Objekten, um zu steuern, welche Netze (in Ebenen) davon betroffen sind.
Felipe Lira
1

Wenn Sie alle Lichter in einem einzigen Durchgang machen würden, müssten Sie alle Lichter im Shader durchlaufen. Sie müssten auch alle Informationen gleichzeitig an die GPU senden.

GPUs sind in der Anzahl der Uniformen begrenzt, die Sie an einen Aufruf übergeben können. Diese Einschränkung hat sich bei UBOs und SSBOs verringert.

Sie sind jedoch immer noch auf die Anzahl der Texturen beschränkt, die Sie für die Schattenzuordnung binden können.

Lichter wirken sich oft nur auf einen kleinen Teil des Bildschirms aus, sodass die Engine möglicherweise nur Geometrie rendert, die sich in der Nähe des Lichts befindet, oder das Ansichtsfenster so anpasst, dass nur der Bereich gerendert wird, auf den sich das Licht auswirken würde.

Ratschenfreak
quelle