Inhoud
- Wat vooraf ging
- Inleiding
- Lighting Pass
- Reflecties
- Post Processing
- Lighting – Blueprint Classes
- Quixel Megascans
- Project Level Creation – Lighting and polishing
- Masterclasses
Wat vooraf ging
- U hebt basiskennis van het programmeren van Blueprint Visual Scripting.
- U bent vertrouwd met de werkomgeving van Unreal Engine.
- U weet hoe u een Blueprint klasse aanmaakt.
- U kunt reeds interactie met de omgeving programmeren.
Inleiding
In de Lighting Pass wordt de belichting geöptimaliseerd. Belichting is belangrijk voor de algehele sfeer van de omgeving.
De Polishing Pass is de eigenlijke afwerking, het finetunen van de omgeving. Dit bevat toevoeging van reflecties, geluid, decals, post processing effecten, het optimaliseren van de programmeercode en de AI (artificiële intelligentie),… De Polishing Pass beslaat zoveel dat het niet in één handleiding kan omvat worden, het beslaat eigenlijk de rest van de opleiding.
Ook Lighting is een studie op zich waar u gerust een hele cursus mee kunt vullen. In deze handleiding geef ik een introductie in Lighting, later, in het tweede jaar van de opleiding gaan we ons verder verdiepen in de belichting van de omgeving.
Situering van deze handleiding binnen Unreal Engine
Lighting Pass
Soorten lichten
Er zijn 4 standaard soorten lichten (een 5de Rect Light is later toegevoegd) die u kunt plaatsen.
U vindt deze onder Modes – Lights.
We gaan ze één voor één aanhalen, werp al eens een blik op de eigenschappen.
Directional Light
Directional Light – Het licht schijnt in een specifieke richting en komt van een bron “oneindig” ver weg waardoor alle schaduwen parallel zijn. Directional Light wordt meestal gebruikt voor zonlicht.
The Directional Light simulates light that is being emitted from a source that is infinitely far away. This means that all shadows cast by this light will be parallel, making this the ideal choice for simulating sunlight.
Point Light
Point Light – licht straal in alle richtingen. Denk aan een klassieke lamp.
Point Lights work much like a real world light bulb, emitting light in all directions from the light bulb’s tungsten filament. However, for the sake of performance, Point Lights are simplified down emitting light equally in all directions from just a single point in space.
Spot Light
Spot Light – te vergelijken met een Point Light maar het licht straal enkel in één richting in een trechter (cone). Merk op hoe in bovenstaande afbeeldingen Spot Lights gebruikt worden om binnenvallend licht te simuleren.
A Spot Light emits light from a single point in a cone shape.
Rect Light
Rect Light – het recent toegevoegd Rect Light maakt het mogelijke een rechthoekig licht uit te stralen (denk aan een TV scherm). Dit werkt enkel goed in combinatie met RTX.
The Rect Light emits light into the scene from a rectangular plane with a defined width and height. You can use them to simulate any kind of light sources that have rectangular areas, such as televisions or monitor screens, overhead lighting fixtures, or wall sconces.
Sky Light
Sky Light – het “hemellicht” meestal bepaald door een Cubemap of geCaptured uit het level zelf via SLS Captured Scene.
The Sky Light captures the distant parts of your level and applies that to the scene as a light.
Mobility
Er zijn 3 soorten Mobility zowel voor actors (objecten geplaatst in een level) als voor lichten.
- Static (Baking)
- Movable (Real-Time)
- Stationary (een combinatie van Static en Movable)
Let op, een level zal vaak combinaties van deze drie soorten bevatten, tenzij het de bedoeling is, zoals in het populaire spel Fortnite, waar alles vernietigbaar en dus Movable is, zullen de 3 soorten vaak gecombineerd worden met het oog op kwaliteit maar ook met het oog op performance.
Static
Static – de belichting, schaduwen worden vooraf gerenderd en opgeslagen in Lightmaps en kunnen nadien, tijdens het spelen, niet meer veranderen. Dit wordt baking genoemd, het licht wordt vooraf gebakken en is nadien onveranderbaar.
Dit heeft tot gevolg dat het vooraf renderen langer zal duren maar de belichting tijdens het spelen minder belastend is voor de prestaties, een betere performance dus.
De kwaliteit van de belichting is hoog maar wanneer u een object met een Static belichting toch zou bewegen, bv. als u het verplaatst in de editor, zal u merken dat de schaduw achter blijft en daar blijft tot u het licht opnieuw Build.
Static Lights worden vooral gebruikt op mobiele toestellen, die niet de real time renderkracht hebben van een pc, of zijn ook ideaal voor het ontwerpen van statische omgevingen.
De Sky Light is standaard Static.
Movable
Movable – de belichting is volledig dynamisch tijdens het spelen en wordt dus niet vooraf gerenderd.
Als een object zich verplaatst zal dus ook zijn schaduw mee verplaatsen.
Zoals u wellicht al vermoed heeft dit een hogere impact op de performance van het spel dan Static lighting. Om deze impact op te vangen is de kwaliteit van een Movable Light lager, zo worden er geen weerkaatsingen (Bouncing/Indirect Lighting) berekend.
In spelen zoals Fortnite, waarin alles vernietigd kan worden, kunt u enkel werken met Movable Lights (en Actors). U zou toch niet willen dat de schaduw van de muur te zien is nadat deze ingestort is?
Beweegbare lichten, bv. de lichten van een auto moeten altijd Movable zijn. Lampen die u aan en uit doet zijn het best ook Movable.
Geen enkel licht is standaard Movable.
Stationary
Stationary – is bedoeld voor lichten die zelf niet bewegen (statisch zoals bv. spots) maar verder wel dynamisch (movable) zijn. Het Stationary Light kan zelf niet bewegen, is statisch, maar andere eigenschappen zoals intensiteit en lichtkleur kunnen wel veranderen (wat bij een Static Light niet kan). Dit levert u het beste van beide werelden op.
Dat Stationary, als gulden middenweg, vaak een goede keuze is bewijst het feit dat alle lichten, behalve Sky Light, standaard Stationary zijn.
Schaduw
Een licht genereert schaduwen. Het zijn de schaduwen die belastend zijn voor de performantie.
Schaduwen komen in verschillende types, geoptimaliseerd voor een typische manier van rendering. Een gedetailleerde schaduw van dichtbij vraagt een andere rendering, een ander type schaduw, dan de schaduw van een gebouw in de verte.
Net zoals bij de lichten wordt een onderscheid gemaakt tussen Static, gegenereerd door een Static Light, en Dynamic, gegenereerd door een Movable/Dynamic Light.
Static Light en Schaduwen
Schaduwen worden gebakken en kan realistische zachte schaduwen leveren.
Onderstaande afbeelding toont een vaas belicht door een Static Light.
Indien u de vaas verplaatst ziet u dat de schaduw achterblijft en dat u het licht moet Rebuilden.
Als u een voorwerp zou verplaatsen blijft de schaduw achter. U zal het level opnieuw moeten Builden, de lichten en schaduwen opnieuw “bakken” om deze achtergebleven schaduw te verwijderen uit het level.
Lighting Quality
U kunt de Lighting Quality voor Static en Stationary Lights bepalen onder Build.
Production levert de beste kwaliteit maar ook een langere, soms wel heel lange (een uur of langer) Build tijd.
Gebruik Production dus enkel voor de finale rendering of wanneer u veel tijd hebt om de Build te laten lopen. Tijdens het werken gebruik ik meestal Medium.
Attenuation Radius
De Attenuation Radius is de straal waarin het licht invloed heeft. Hoe groter deze Attenuation Radius hoe groter het gebied waarin het licht invloed heeft en hoe complexer de Lightmap wat de baking/building negatief beïnvloedt.
De blauwe cirkel duidt de Attenuation Radius aan, de gele cirkel de Source Radius (de straal van de lichtbron zelf). Een grotere Source Radius levert een zachtere schaduw op.
De eigenschap Attenuation Radius bepaalt:
- het bereik van het licht.
- welke objecten beïnvloed worden door het licht.
Weet dat een grote Attenuation Radius voor problemen kan zorgen bij Static en Stationary Lights en ook een negatief effect heeft op de performance (bij dynamic lighting) of de baking/building tijd bij Static en Stationary Lights.
Hierboven ziet u de invloed van een Attenuation Radius van respectievelijk 200, 400 en 800.
Een nadeel van Stationary Lights is dat er slechts een beperkt aantal (3) mogen overlappen. Is er meer overlapping dan valt dat specifieke licht terug op Movable. Dit moet u vermijden. Pas dus indien nodig de Attenuation Radius aan om overlapping te voorkomen.
Onderstaande video is een bijdrage van de cursist Thomas Van Sande.
Exposure
Exposure, of Eye Adaption, is een standaard ingebouwde techniek die ervoor zorgt dat, zoals in het echt, het “oog” van de speler zich aanpast aan donkere ruimten. Concreet, een donkere ruimte zal na enige tijd lichter worden. Probeer dit maar eens uit in het echt.
Natuurlijk, dit effect past het licht aan, het wordt lichter. Nu is de vraag, behouden we dit effect, passen we het aan of schakelen we het uit. Indien u heel veel aandacht besteed aan de juiste belichting kunt u dit het best uitschakelen, want anders zal veel van uw werk verloren gaan. Voor zuivere gameplay is dit echter leuk meegenomen, het is tenslotte een simulatie van de echte wereld, ook onze ogen passen zich aan, aan de duisternis.
Omdat perfecte belichting geen doel is in dit project en het meer om het bouwen van het level zelf gaat heb ik gekozen om het te behouden.
U kunt het instellen (of uitschakelen) via de Viewport.
- Ga naar Lit – Exposure en vink Game Settings uit.
Wilt u dit uitschakelen tijdens de Gameplay dan moet u dit doen via Post Processing.
Lightmap UV’s
Static Lights worden “gebakken” in de omgeving maken hiervoor gebruik van de Lightmap UV van de objecten.
Gelukkig worden deze automatisch aangemaakt door Unreal Engine, u hunt ze bekijken in de Static Mesh Editor.
Indien nodig kan u de Lightmap Resolution voor het object verhogen om een betere Lighmap, en dus een betere belichting en schaduw, voor dit object te krijgen.
In een latere, meer gespecialiseerde handleiding, ga ik hier wat dieper op in. Voorlopig volstaat het dat u weet hebt van het bestaan van deze Lightmap UV’s.
Onderstaande video’s zijn een korte samenvatting.
Reflecties
PBR Materialen kunnen reflecties weergeven.
Een paar bedenkingen vooraf:
- Reflecties zijn belastend om in Real-Time te renderen.
- Unreal Engine kent 3 technieken om reflecties te berekenen met alle 3 voor- en nadelen.
- Deze 3 technieken worden alle 3 in order gerenderd en nadien geblend (samengevoegd) tot de uiteindelijke reflectie.
- Nadien worden de reflecties geblend (samengevoegd) met de rest van de rendering.
De 3 technieken in volgorde van uitvoering en van lage prioriteit naar hoge zijn:
- Reflection Captures
- Planar Reflections
- Screen Space Reflections
In deze inleidende handleiding bekijken we enkel de Reflection Captures en hoe deze te plaatsen.
Reflection Captures
U kunt zelf, in uw level, op plaatsen waar reflectie nodig is Reflection Captures plaatsen.
- U vindt ze in het Modes-panel en ze komen als Sphere of als Box.
Meestal wordt gekozen voor Sphere Reflection Capture.
U plaats de Reflection Captures in uw level waar betere reflectie nodig is.
- Een Reflection Capture maakt een statische cubemap, een 360° afbeelding van de omgeving, aan. Deze reflectiecubemap/afbeelding wordt nadien geblend met de omgeving.
- De reflectiecubemap wordt vooraf berekend, op het moment dat de level gestart wordt of op het moment dat u de applicatie publiceert (dan wordt ze als een afbeelding opgeslagen (baked) en gebruikt op het moment dat het nodig is), en werkt dus niet in Real-Time.
- Omdat de reflectiecubemap vooraf berekend wordt is ze heel snel en toch scherp.
- Deze techniek is inaccuraat, u krijgt enkel maar een correcte reflectie als u, de camera, op identiek dezelfde plaats staat waar de reflectiecubemap genomen is.
- De Reflection Captures beogen enkel een lokaal effect.
Post Processing
Post Processing is een hele reeks van effecten dit u kunt gebruiken om de algehele “look and feel” alsook de performance van uw project te finetunen.
Denk aan effecten als:
Zoals de benaming het zelf zegt Post Processing worden deze effecten helemaal achteraan het render proces toegepast.
- Om Post Processing toe te voegen, voeg een Post Process Volume toe vanuit het Modes-panel.
U kunt meerdere Post Processing Volumes toevoegen aan uw level. Stel dat u een zwembad hebt en u wilt speciale onderwatereffecten, dan kunt u dit bekomen met een specifiek Post Process Volume.
- Wilt u echter het Post Process Volume gebruiken voor de volledige level dan moet u Infinite Extend (Unbound) aanvinken.
Als demonstratie heb ik er een paar geactiveerd en telkens de basisinstellingen behouden.
Ambient Occlusion
Ambient Occlusion zorgt voor meer schaduw in de hoeken.
Vignette
Iets donkerder in de hoeken van het scherm en iets lichter centraal.
Lens Flare
Een camera-effect dat wel eens in films wordt gebruikt.
Eye Adaption (Exposure)
Hier heb ik veel over gesproken tijdens de handleiding Lighting. Uiteindelijk heb ik besloten het te behouden, wilt u het echter uitschakelen (of finetunen) dan kunt u dit onder Exposure in het Post Process Volume.
- Vink Min Brightness en Max Brightness aan en zet ze beiden op 1 om Exposure uit te schakelen (te neutraliseren).
Lighting – Blueprint Classes
Licht maakt vaak onderdeel uit van een Blueprint Class in combinatie met andere objecten.
Als voorbeeld maak ik een eenvoudige lichtschakelaar aan die meerdere lampen bedient.
- Maak een nieuw ThirdPerson project aan met StarterContent.
- Ik ga gebruik maken van de Blueprint_WallSconce die u vindt in de StarterContent. De Blueprint_WallSconce bevat reeds een PointLight2 die we gaan aansturen vanuit onze lichtschakelaar.
We maken een nieuwe Blueprint Class aan voor de Lichtschakelaar.
- In de Content Browser, klik op Add New – Blueprint Class (of klik met de rechtermuisknop in de folder waar u uw Blueprints plaatst en klik op Blueprint Class).
- Kies de Parent Class Actor.
- Geef de gewenste naam, bv. Lichtschakelaar, en dubbelklik om te openen.
- Voeg een Static Mesh (Schakelaar, een eenvoudige Cube)), een Box Collision (voor de Overlap Events) en een TekstRender toe.
De lichtschakelaar moet meerdere, en weten niet precies hoeveel, lichten, van het type Blueprint_WallSconce kunnen aandoen. We hebben dus een Array, een lijst, van het type Blueprint_WallSconce nodig.
- Voeg een Array, met bv. de naam Lampen, toe van het type Blueprint_WallSconce. Maak deze Array Instance Editable zodat we gemakkelijk elementen kunnen toevoegen vanuit de Level Editor.
- Bij het starten moet de tekst onzichtbaar zijn en de lampen uit. Om zeker te zijn dat ik er geen vergeet, en voor het gemak, programmeer ik dit in de Construction Script van de Lichtschakelaar. Doorloop de Array (For Each Loop) van alle Lampen en zet voor iedere Lamp de Intensity op 0.
- De Overlap Events maken de TextRender (on)zichtbaar en Enabled of Disabled de Input.
- Bij het drukken op de F-toets schakelen alle lichten aan of uit. Gebruik een Flip Flop voor de ene keer aan en de andere keer uit. Doorloop de Array (For Each Loop) van alle Lampen en zet voor iedere Lamp de Intensity.
- De Blueprint Lichtschakelaar is klaar, Compile en Save.
- Voeg tenslotte de Lichtschakelaar(s) en de nodige Blueprint_WallSconces toe aan het Level. Vergeet niet de Blueprint_WallSconces toe te kennen aan de gewenste lichtschakelaar.
- Druk op Play, het zou moeten werken.
In bovenstaand voorbeeld heb ik een te hoge, onrealistische waarde gegeven, enkel opdat het gebruik meteen zou opvallen. Een meer realistische waarde voor een Point Light ligt rond de 2000 tot 4000.
Videotutorials
Onderstaande videotutorials bevatten een aantal zaken die nog niet in de les besproken zijn (zoals Materials en Particles). Maar in de laatste handleiding van de module Eenvoudige functionaliteiten mag het al eens iets meer zijn, om u warm te maken voor het vervolg.
Quixel Megascans
Onderstaande video voegt belichting toe aan het Level en geeft een aantal artistieke en technische tips.
Project Level Creation – Lighting and polishing
De Lighting pass en Polishing pass zijn de twee laatste fasen in het ontwerpen van een level. Hoewel deze twee fasen hier in slechts één video worden samengenomen zijn ze zeker niet minder belangrijk en worden ze ook vaak door specialisten uitgevoerd. Maar wij houden het nog eenvoudig.
Adding props and lighting
Zo, dit was het laatste deel in deze reeks van tutorials die de nadruk legde op het bouwen van een level.
Masterclasses
Als herhaling, en/of overzicht, raad ik aan onderstaande video te bekijken.
Behandelde Basiscompetenties uit de module ICT Programmeren – Specifieke ontwikkelomgeving: eenvoudige functionaliteiten
- IC BC236 – kan eenvoudige wijzigingen aan een programma aanbrengen
- IC BC241 – kan een programma in een specifieke ontwikkelomgeving maken
- IC BC247 – kan de bouwstenen van een specifieke ontwikkelomgeving gebruiken
- IC BC249 – kan de instellingen van een specifieke ontwikkelomgeving wijzigen