Mehrere Lichter in einer 3D Szene
Verfasst: 07.07.2011, 17:58
Hallo Community
Ich habe mich mal mit dem Thema "mehrere Lichter in einer Szene" auseinandergesetzt und meinen 3D Leveleditor den ich für mein aktuelles Game "Zorn der Könige" (http://www.zdk-online.com) entsprechend erweitert. Als Renderer verwende ich OpenGL und GLSL für die Shader.
Die meisten Tutorials die sich mit Per-Pixel Lightning, Normal Mapping usw. befassen, beleuchten oft ein einziges Objekt mit einer Lichtquelle. Doch eine Szene in einem Game besteht schliesslich aus mehreren Lichtquellen und Objekten.
Googelt man nach diesem Thema, kommt man auf die Technik "Deferred Shading/Lightning". Dies ist ein völlig anderer Ansatz als dem klassischen Forward Shading in OpenGL. Ich habe aber trotzdem eine andere Variante gewählt die ich hier kurz vorstellen möchte.
OpenGL unterstützt nur 8 Lichter, je nach Hardware können auch mehrere Verwendet werden. Ich verwende nun die Technik des Virtual Lightnings, verwende als immer wieder die gleichen Lichter um verschiedene Objekte zu beleuchten. In meiner Implementation verwende ich 4 Lichter.
Zuerst erstelle ich aus der Geometrie und Lichtern in der Szene sogenannte Lichtgruppen. Für jedes Polygon (für komplexe Objekte wird das ganze Objekt berücksichtigt) wird berechnet, welche Lichter in der Szene am nächsten sind. Diese Lichter (max. 4) bilden eine Lichtgruppe. Es können nun mehrere Polygone bzw Objekte existieren die der gleichen Lichtgruppe angehören.
Für das Rendern iteriere ich durch alle Lichtgruppen. Pro Gruppe werden die 4 Lichter entsprechend gesetzt. Jetzt werden alle Geometrien gerendert und werden von den 4 Lichtern der Gruppe beleuchtet.
Vorteil dieser Technik ist die ziemlich einfache Implementation. Shader Code für Normal Maps, Parallax Mapping usw. können einfach übernommen und erweitert werden. Es ist nur ein Renderpass nötig, die Lichter werden nur pro Gruppe neu Platziert.
Der Nachteil ist, grosse Polygon und Objekte werden nicht korrekt beleuchtet, da diese von mehr als 4 Lichtern betroffen sind. Dies kann verhindert werden indem man die Objekte verkleinert. Da die Lichter immer neu Platziert werden, könnte es die Performance beeinträchtigen.
Die Technik ist nichts neues doch funktioniert in meinem Editor schon ziemlich gut. Beim erstellen von Levels werde ich feststellen wo die Grenzen dieser Technik sind. Doch um "schnell mal" eine Szene mit mehreren Lichtern zu beleuchten ist dies sicher eine gute Alternative zum Deferred Shading.
Hier noch der GLSL Shader Code:
http://www.deltasoftgames.ch/dev/multi-lights.v
http://www.deltasoftgames.ch/dev/multi-lights.f
Szene im Editor mit total 8 Lichtern, virtualisiert mit 4 Lichtern. Zu beachten ist hier dass der Boden in mehrere Polygone aufgeteilt ist, mit einem grossen Polygon für den Boden würde dies nicht funktionieren.
Ich habe mich mal mit dem Thema "mehrere Lichter in einer Szene" auseinandergesetzt und meinen 3D Leveleditor den ich für mein aktuelles Game "Zorn der Könige" (http://www.zdk-online.com) entsprechend erweitert. Als Renderer verwende ich OpenGL und GLSL für die Shader.
Die meisten Tutorials die sich mit Per-Pixel Lightning, Normal Mapping usw. befassen, beleuchten oft ein einziges Objekt mit einer Lichtquelle. Doch eine Szene in einem Game besteht schliesslich aus mehreren Lichtquellen und Objekten.
Googelt man nach diesem Thema, kommt man auf die Technik "Deferred Shading/Lightning". Dies ist ein völlig anderer Ansatz als dem klassischen Forward Shading in OpenGL. Ich habe aber trotzdem eine andere Variante gewählt die ich hier kurz vorstellen möchte.
OpenGL unterstützt nur 8 Lichter, je nach Hardware können auch mehrere Verwendet werden. Ich verwende nun die Technik des Virtual Lightnings, verwende als immer wieder die gleichen Lichter um verschiedene Objekte zu beleuchten. In meiner Implementation verwende ich 4 Lichter.
Zuerst erstelle ich aus der Geometrie und Lichtern in der Szene sogenannte Lichtgruppen. Für jedes Polygon (für komplexe Objekte wird das ganze Objekt berücksichtigt) wird berechnet, welche Lichter in der Szene am nächsten sind. Diese Lichter (max. 4) bilden eine Lichtgruppe. Es können nun mehrere Polygone bzw Objekte existieren die der gleichen Lichtgruppe angehören.
Für das Rendern iteriere ich durch alle Lichtgruppen. Pro Gruppe werden die 4 Lichter entsprechend gesetzt. Jetzt werden alle Geometrien gerendert und werden von den 4 Lichtern der Gruppe beleuchtet.
Vorteil dieser Technik ist die ziemlich einfache Implementation. Shader Code für Normal Maps, Parallax Mapping usw. können einfach übernommen und erweitert werden. Es ist nur ein Renderpass nötig, die Lichter werden nur pro Gruppe neu Platziert.
Der Nachteil ist, grosse Polygon und Objekte werden nicht korrekt beleuchtet, da diese von mehr als 4 Lichtern betroffen sind. Dies kann verhindert werden indem man die Objekte verkleinert. Da die Lichter immer neu Platziert werden, könnte es die Performance beeinträchtigen.
Die Technik ist nichts neues doch funktioniert in meinem Editor schon ziemlich gut. Beim erstellen von Levels werde ich feststellen wo die Grenzen dieser Technik sind. Doch um "schnell mal" eine Szene mit mehreren Lichtern zu beleuchten ist dies sicher eine gute Alternative zum Deferred Shading.
Hier noch der GLSL Shader Code:
http://www.deltasoftgames.ch/dev/multi-lights.v
http://www.deltasoftgames.ch/dev/multi-lights.f
Szene im Editor mit total 8 Lichtern, virtualisiert mit 4 Lichtern. Zu beachten ist hier dass der Boden in mehrere Polygone aufgeteilt ist, mit einem grossen Polygon für den Boden würde dies nicht funktionieren.