Ich brauche Hilfe bei 3D-Schattierung / Beleuchtung

8

Wie geht ihr mit Shading in einem 3D-Spiel um? Ich habe eine gerichtete Lichtquelle, die eine Seite eines Baumes aus Würfeln beschattet. Die restlichen 3 Seiten erhalten nur Umgebungsschattierungen. Der 3D-Effekt geht also verloren, wenn zwei schattierte Umgebungsseiten betrachtet werden. Vermisse ich etwas Sollte ich die von der Lichtquelle am weitesten entfernte Seite noch dunkler beschatten? Ich habe versucht, Fallout 3 zu betrachten, und es sieht so aus, als ob es das ist, was sie tun. Minecraft scheint jedoch einen Grashügel mit zwei gegenüberliegenden Seitenlicht und den verbleibenden zwei gegenüberliegenden Seiten dunkel zu beschatten, was den Effekt hat, dass es zwei Richtungslichter für die beiden Lichter gibt schattierte Seiten und Umgebungslicht für die dunklen schattierten Seiten.

Xavier
quelle

Antworten:

5

Ihr Problem ist, dass Ihr Umgebungslicht eine konstante Farbe hat. In der Realität ist das Umgebungslicht von oben hell und von unten dunkel, da das Licht normalerweise von oben kommt.

Sie können viel tun, um dies zu beheben. Zumindest sollten Sie eine Vertex-Shader-Konstante für "obere Umgebungsfarbe", "untere Umgebungsfarbe" und "obere Umgebungsrichtung" haben.

Nehmen Sie in Ihrem Vertex-Shader das Punktprodukt der "oberen Umgebungsrichtung" und der Vertex-Normalen und verwenden Sie das Ergebnis, um zwischen der "oberen Umgebungsfarbe" und der "unteren Umgebungsfarbe" zu wechseln:

float value = dot( vertex_normal, top_ambient_direction ) * 0.5 + 0.5;
ambient_color = lerp( bottom_ambient_color, top_ambient_color, value );

Dies ist eine der einfacheren Möglichkeiten, um die Umgebung besser aussehen zu lassen, und wurde häufig in PS2- und XBOX1-Spielen verwendet. Zeitgenössische Spiele gehen noch weiter, indem sie eine "Umgebungs-Cubemap" oder "Umgebungs-Sphärische-Harmonische-Koeffizienten" verwenden.

bmcnett
quelle
3

Dies ist ein komplexes Thema, und ich bin kaum qualifiziert, darüber zu sprechen, aber ich werde es versuchen. Viele Spiele verwenden eine vorgebackene Lichtkarte, die das von mehreren Oberflächen reflektierte Licht berücksichtigt und diese dann mit dynamischer Beleuchtung kombiniert, um eine schnelle, realistische und gut aussehende Umgebung zu erzeugen. Es gibt wahrscheinlich moderne Spiele, die in Echtzeit leicht springen.

Zu beachten ist, dass sich das Licht mit der Entfernung abschwächt. Wenn sich Ihre Lampe in einem Winkel zu einer Oberfläche befindet, ist die nähere Kante heller als die weiter entfernte Kante. Dinge sehen in der Regel sehr falsch aus, wenn eine Lampe direkt auf sie scheint und nicht in einem Winkel.

Die Beleuchtung von Minecraft ist etwas Besonderes, da sie ein seltsames System verwendet, bei dem Licht fast wie Wärme behandelt wird, die durch die Welt diffundiert: http://www.minecraftwiki.net/wiki/Light Es lässt sich nicht einfach auf eine Allzwecklösung erweitern.

Der coolste Effekt, den ich je gesehen habe, heißt Umgebungsokklusion. Es ist teuer und wird normalerweise nur in einer vorgebackenen Lösung verwendet. Dabei wird jedoch berücksichtigt, wie die Ecken des Raums dunkler sind, da die Wände das Umgebungslicht verdecken. In der Mitte der Wand trifft das Licht einer Halbkugel auf sie, während in der Ecke, in der sich drei Oberflächen treffen, nur das Licht einer Hemidemisemisphäre (1/8 Kugel) vorhanden ist. https://secure.wikimedia.org/wikipedia/en/wiki/Ambient_occlusion

Es gibt Unmengen von Schriften über Beleuchtungssysteme; Durchsuchen wird Ihnen wahrscheinlich gute Dienste leisten.

Gregory Avery-Weir
quelle
0

Beleuchtung / Schattierung muss weiter fortgeschritten sein als nur eine binäre Entscheidung. Blöcke werden von einem Licht weder beleuchtet noch vollständig beleuchtet, sie können teilweise beleuchtet werden. Manchmal sollte das Gesicht völlig glänzend sein. In diesem Fall wird es direkt vom Licht getroffen. Manchmal möchten Sie das Umgebungslicht nur dann, wenn es vom Licht völlig unberührt bleibt. Wenn es jedoch teilweise verdeckt ist, müssen Sie einen Lichtwert zwischen vollständig beleuchtet und vollständig unbeleuchtet festlegen.

Die Standard-Grundbeleuchtungsmethode wechselt von Nulllicht zu Maximallicht, basierend auf der Winkeldifferenz zwischen dem einfallenden Lichtstrahl und der Oberflächennormalen des Gesichts, das Sie beleuchten.

Wenn die Normalen der Oberfläche gleich sind (oder entgegengesetzt, je nachdem, wie Sie sie betrachten), haben Sie maximale Helligkeit. Wenn der Winkel zwischen dem einfallenden Licht und der Oberflächennormalen zunimmt, erhalten Sie von diesem Licht immer weniger Licht auf diesem Gesicht.

Auf diese Weise sollte bei zwei Lichtern jedes Gesicht eine Helligkeit erhalten, die eine Kombination aus der Helligkeit ist, die jedes Licht je nach Winkel auf jedes Gesicht ausübt.

Dies sollte viel natürlicher sein als der Versuch festzustellen, ob ein einzelnes Gesicht beleuchtet ist oder nicht. Sie haben einen natürlichen Farbverlauf, wenn sich die Oberflächen weiter vom Licht entfernen, und Sie balancieren für Oberflächen, die von mehr als einem Licht beeinflusst werden.

SpacePrez
quelle