====== Lab 7: Special Effects ====== {{:public:t-vien-15-3:lab7-image.png?500|}} ===== Goal ===== The goal of this lab is to try out and appreciate some very simple but effective techniques for producing a more life-like environment. Essentially a few well-placed illusions. ===== Documentation ===== * Unity's [[http://docs.unity3d.com/Manual/GlobalIllumination.html|Lighting Settings]], [[http://docs.unity3d.com/Manual/script-SunShafts.html|Sun Shafts]], [[http://docs.unity3d.com/Manual/script-ScreenSpaceAmbientOcclusion.html|Ambient Occlusion]] and [[https://docs.unity3d.com/Documentation/Manual/ParticleSystems.html|Particle Systems]] ===== Procedure ===== - **Make an Environment** Create any enironment you want, but make sure that you have a visible sun in the sky. If your skybox does not contain a circular disk representing the sun, you can turn on the ''Halo'' property of the ''Directional Light'' to make the light source visible in a way that resembles a sun. Also make sure you have at least one indoor location where a sun can shine through some kind of an opening (e.g. window or cracks). Place and rotate such strucures until you are sure the sun can be seen through some of the openings. If you are importing ready-mader objects, make sure they are not using ''Legacy'' shaders, if they are, turn them into ''Standard'' shaders. Import the ''Characters'' asset package and replace the ''Main Camera'' with a ''FPSController''. - **Tweak Lighting** Open the **Window->Lighting** panel and play with the ''Ambient'' settings to make the indoor lighting in particular feel more realistic. If the ''Ambient Source'' is the ''skybox'', then the coloring of the indoor walls will match the coloring of the sky, which may not make any sense. Try switching to ''Color'' and chosing a tint that better matches the atmosphere you are creating inside. Also lower the ''Ambient Intensity'' to create a bigger contrast between the inside and outside lighting, and to make shadows more intense. To further increase the contrast between lit and unlit areas, you can lower the ''Reflection Intensity'' as well (this is the amount of light received as a reflection from other objects). - **Add Ambient Occlusion** First notice how the seams where polygons meet the ground and each other at inside corners, seem too evenly lit - you would expect that corners would be slightly darker than the surrounding flat surfaces. Those corners should be darker because the surfaces there have access to less ambient light, as they are partially occluded by another surface. The effect that is needed is called ambient occlusion, and it can be added as a post-processing step attached to the rendered frame. Import the ''Effects'' asset package. Add the ''Image Effects->Rendering->Screen Space Ambient Occlusion'' script to your ''FPSController->FirstPersonCharacter'' game object. Play with its settings and look in particular at the seams where different polygons meet. Also try out the ''Image Effects->Rendering->Screen Space Ambient Obscurance'' script which has more or less the same effect, but may have less side-effects (such as odd shadows in the leaves of trees). - **Add Sun Shaft** Add the ''Image Effect->Rendering->Sun Shafts'' script to your ''FPSController->FirstPersonCharacter'' game object. Drag your ''Directional Light'' into its ''Shafts caster'' property. Drag the ''Directional Light'' higher up into the sky, in the direction of the Sun in the skybox (you can turn on the ''Halo'' property of the ''Directional Light'' to see the light as a glowing disk, which you can line up with the skybox sun, so that the light will seem to come from that direction (try moving around the environment to check if the halo disk stops covering the skybox sun when you change your location. You will find that you really need to place the directional light super-super-far-away for it to remain more or less stationary in the sky because of the motion parallax effect). Move to a location in the scene where the sun is barely visible (e.g. through a window). Play with the Sun Shaft parameters. - **Add Particle Effect** Add an effect that emulates dust particles visible inside the rays of sun that penetrate your indoor environment. Right above your **Hierarchy** panel select **Particle System** from the **Create** drop-down menu. It should already be producing shiny little particles. Place the system right where beams of light hit the floor of your indoor environment and rotate it so that the particles travel in the direction of the beams towards the opening where the light shines through. Look at the parameters you can adjust in the **Inspector** panel for the particle system. You need to make these particles imitate very small dust moving very slowly through the air. You can play with the following adjustments: * In the **Shape** module: Select the ''Box'' emitter shape. This will shoot the particles in one direction (which you can control by rotating the box). * In the **Emission** module: Slow down the rate of particle generation until you just get a few per second (e.g. 3 per second or so). * In the **Particle System** general parameter module: Play with ''Start Speed'' and ''Start Size''. Make them really really small! If you press the down arrow next to a parameter value, you can choose from some dynamic options instead of just using a constant value. For example, try making the speed random. * In the **Color over Lifetime** module (you have to first add a check mark to include this module): Click on the color bar to open the [[https://docs.unity3d.com/Documentation/Manual/GradientEditor.html|Gradient Editor]]. Make the particles fade in from full transparency to full opacity and then again back to full transparency. To do this you need to add one new **Alpha** marker in the middle, which you set to full opacity (Alpha 255), while setting the other two **Alpha** markers to full transparency (Alpha 0).