<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://leochaumartin.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lch</id>
	<title>LC Assets - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://leochaumartin.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lch"/>
	<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php/Special:Contributions/Lch"/>
	<updated>2026-05-20T05:33:44Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.38.1</generator>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=65666</id>
		<title>Mirage</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=65666"/>
		<updated>2025-11-26T09:21:03Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Setup ==&lt;br /&gt;
The whole package is contained in the Mirage folder resulting from the import but you can move it wherever you want.&lt;br /&gt;
&lt;br /&gt;
== What is an impostor ==&lt;br /&gt;
An impostor or imposter is a dynamically rendered billboard texture map used to give an illusion of 3D geometry in the distance. &lt;br /&gt;
&lt;br /&gt;
In the Mirage context, you can have as many objects as you want in a single impostor, and all the the points of view are stored into an abedo, normal and metallic maps. Smoothness or occlusion are not baked into textures yet but are still customizable on post baking options.&lt;br /&gt;
== How to bake your first impostor ==&lt;br /&gt;
&amp;lt;code&amp;gt;Mirage&amp;lt;/code&amp;gt; consists in a single editor window. You can open it via &amp;lt;code&amp;gt;Window-&amp;gt;Mirage-&amp;gt;Impostors&amp;lt;/code&amp;gt;. For a simple one-click impostor approach, drag and drop the common ancestor of all the objects you want to bake into target area and click on the &amp;lt;code&amp;gt;Generate Impostor&amp;lt;/code&amp;gt; button. &lt;br /&gt;
&lt;br /&gt;
You can also customize a lot of settings for a more advanced usage. There are 5 category foldouts that can expanded or hidden by clicking on their title. Even when hidden, they still provide basic information or controls on the right of the title. &lt;br /&gt;
&lt;br /&gt;
The following sections will provide detailed explaination of each category.[[File:Image 2024-02-06 164734156.png|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
=== Setup the target(s) ===&lt;br /&gt;
This category holds all the source object(s) information. Note that only one impostor can be baked at a time, so all the target will all be part of the same impostor. &lt;br /&gt;
For a simple approach, drag and drop the common ancestor in the dedicated field. Note that if you want to bake only one object the common ancestor can be the object itself or its parent. When the common ancestor is set, Mirage will automatically detect all the mesh filters in its children, recursively. You can check which mesh filters are included by expanding the section as following. Null or invalid objects will be ignored. &lt;br /&gt;
[[File:Image 2024-02-06 170842562.png|center|thumb|357x357px]]&lt;br /&gt;
You can also exclude some meshes or add some manually by dropping them into the area. If you change the mesh filters manually, the common ancestor will be updated accordingly. Note that '''a common ancestor is needed to bake an impostor'''. &lt;br /&gt;
&lt;br /&gt;
=== Quality Settings ===&lt;br /&gt;
This category is crucial and will have a direct impact on the visual quality of the impostor as it provides full control over the baking topology. This section should be paired with the &amp;lt;code&amp;gt;Information&amp;lt;/code&amp;gt; category that provides real-time visualization for an excellent and fast control over the baking topology.&lt;br /&gt;
[[File:Image 2024-02-06 172158522.png|center|thumb|483x483px]]&lt;br /&gt;
&lt;br /&gt;
==== Texture Size ====&lt;br /&gt;
As previously mentionned, Color, Normal and Metallic Maps are stored into square POT atlases. This field controls the resolution of these atlases, from 128x128 to 4096x4096. The &amp;lt;code&amp;gt;Estimated total size&amp;lt;/code&amp;gt; label provides the size of the whole impostor prefab after baking (with DXT compression) &lt;br /&gt;
&lt;br /&gt;
==== Sphere Type ====&lt;br /&gt;
&lt;br /&gt;
*'''UV sphere''': The default choice.  The UV sphere is based on a fixed number of longitude and latitude samples.  The coverage is denser at the poles.The UV Sphere is a solid choice in many use cases, with more versatility regarding partial sphere baking.&lt;br /&gt;
*'''Pseudo-Fibonacci sphere''': at an experimental stage.  Provides a homogeneous coverage. Not compatible with latitude interpolation in the impostor shader. Despite being homogeneous, the output impostor will look smooth near the equator, with more noticeable snaps or blur around the poles. Full sphere baking only.&lt;br /&gt;
&lt;br /&gt;
==== Longitude Samples ====&lt;br /&gt;
UV Sphere only. Holds the number of longitudinal samples. The higher the better for smooth horizontal rotation, at a cost of higher POV number thus lower resolution/POV in the atlas. All samples are equally spread around the 360 degrees.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Samples ====&lt;br /&gt;
UV Sphere only. Holds half of the number of latitudinal samples (equator excluded). This means that a 0 value will just bake around the equator. 1 will bake an additionnal sample on each side of the equator, and so on.&lt;br /&gt;
&lt;br /&gt;
The higher the better for smooth vertical rotation, at a cost of higher POV number thus lower resolution/POV in the atlas. &lt;br /&gt;
&lt;br /&gt;
==== Latitude Offset ====&lt;br /&gt;
UV Sphere only. Shifts the equator sample. Useful for partial spheres.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Step ====&lt;br /&gt;
UV Sphere only. Holds angular offset between two latitudinal samples. A small value will increase smoothness of vertical rotation, but may limit the global latitudinal range.  &lt;br /&gt;
&lt;br /&gt;
==== Density ====&lt;br /&gt;
Pseudo-Fibonacci sphere only. Controls the density of the sphere. The higher the better for smooth rotations in any direction, at a cost of higher POV number thus lower resolution/POV in the atlas.&lt;br /&gt;
&lt;br /&gt;
==== Lighting Method ====&lt;br /&gt;
&lt;br /&gt;
# '''Surface Estimation:''' Computes dedicated normal and metallic map atlases to get physically correct light reflections on the impostor. The recommended method. The baked impostor will use a lit surface shader.&lt;br /&gt;
# '''Use Scene Sun Source:''' Adds the sun source of the opened scene in the baking context. Can provide better results on single lit scenes, especially with intricate smoothness/occlusion materials. Uses significantly less memory per impostor. The baked impostor will use an unlit shader.&lt;br /&gt;
&lt;br /&gt;
==== Presets ====&lt;br /&gt;
You can add/load presets easily with the dedicated buttons. Gives an additional degree of freedom to match your workflow. A few relevant presets are already included such as 1-POV-billboard or different hemispheres. Importing a preset and modifying values won't modify the preset unless you explicitly export and replace it.&lt;br /&gt;
&lt;br /&gt;
=== Information ===&lt;br /&gt;
The whole information foldout is readonly. It provides useful visual feedback to help tweaking the previous category fields.&lt;br /&gt;
&lt;br /&gt;
[[File:Image 2024-02-06 180549368.png|center|thumb|426x426px]]&lt;br /&gt;
On the left column, some metrics are displayed. The values will appear in green is considered valid, orange when considered too low/high. Please note that these colors are purely informative and won't inhibit the impostor generation. &lt;br /&gt;
&lt;br /&gt;
* The total number of POV.  &lt;br /&gt;
** For UV Sphere Baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = S_{Long}*S_{Lat}&amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
** For Pseudo-Fibonacci Sphere baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = \sum_{l=-S_{Lat}/2}^{S_{Lat}/2}cos(\frac{2\pi.l}{S_{Lat}}).S_{Long} &amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The Atlas POV size. 15x15 means there are 15 POVs per line and per column.&lt;br /&gt;
* Single POV resolution&lt;br /&gt;
* The atlas coverage : if &amp;lt;math&amp;gt;\sqrt{N_{POV}}&amp;lt;/math&amp;gt; is an integer, the coverage will be 100% otherwise there will be blank slots in the atlas. 100% is better but not necessary.&lt;br /&gt;
* Unused memory : The estimated memory held by the blank slots in the grid. Will be 0 if the coverage is 100% &lt;br /&gt;
&lt;br /&gt;
On the right area stand 3 tabs for more visual information.&lt;br /&gt;
&lt;br /&gt;
* POVs : Visualize the Longitude / Latitude coverage. A great helper when tweaking the Quality Settings. You can orbit around with the mouse to see clearer.&lt;br /&gt;
* Layout : Visualize the Atlas  layout. Filled atlas slots will be green, blank will be red.&lt;br /&gt;
* Preview :  Visualize how pixelated your each single POV will be. Displays the actual objects entered in the Target foldout. You can orbit around with the mouse as well. &amp;lt;!-- Please note the snappiness/bluriness won't be previewed here. The area only shows your inputs layout in the impostor and the pixelization but does not stand for a contractual appearance of the ouput impostor. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LODGroup Settings ===&lt;br /&gt;
This category is not crucial since you can always modify it afterwards, but it can make you save a lot a time. If you just want to bake the impostor to a prefab without adding it to the scene, you can untick the field Automatic Setup.&lt;br /&gt;
[[File:Image 2024-02-06 183403606.png|center|thumb|394x394px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 4 possible scenarios for this area. &lt;br /&gt;
&lt;br /&gt;
* None of the input meshes are part of a LODGroup : A LODGroup will be added on the common ancestor. all the source renderers will be added in LOD0 and the impostor will be added in LOD1 following the given settings. A cross fading is added for smooth transitions.&lt;br /&gt;
* There is already a LODGroup but no impostors : The impostor will be added in an additional LOD level following the given parameters. Note that all the source renderers MUST belong to either no LOD or the same LOD level from the same LODGroup to avoid nested LODGroup errors.&lt;br /&gt;
* There is already a LODGroup with an impostor : The impostor will be replaced using the same relative height transition. Note that impostors are detected thanks to the ImpostorReference script attached to the LODGroup. If you want to have several impostors in the same LODGroup, just delete safely the ImpostorReference component before baking. Also, the previous impostor's prefab will not be deleted, only the instance in the scene will be replaced.&lt;br /&gt;
* There isn't any common ancestor for the input objects. Baking won't be possible.&lt;br /&gt;
&lt;br /&gt;
== Runtime Baking (Mirage PRO only) ==&lt;br /&gt;
It is possible to bake impostors at Runtime using the MirageRuntimeImpostor component. &lt;br /&gt;
[[File:Mirage Pro Runtime Baking.png|center|thumb]]&lt;br /&gt;
The parameters are identical to the Mirage Editor Window, and you can use the same presets. The baking process is blocking at the moment and usually takes 1 to 2 seconds.&lt;br /&gt;
&lt;br /&gt;
=== Trigger modes ===&lt;br /&gt;
Currently there are only 2 trigger modes:&lt;br /&gt;
&lt;br /&gt;
* OnStart: Bakes the impostor when the Start method is called&lt;br /&gt;
* ViaScrcipt: Create or update the impostor by calling the public method &amp;lt;code&amp;gt;MirageRuntimeImpostor.BakeRuntimeImpostor()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Save Path ==&lt;br /&gt;
Impostors are saved as packed prefabs, embedding the quad mesh, the atlas(es) and the material. You can customize this path in this section.&lt;br /&gt;
[[File:Image 2024-02-06 184910768.png|center|thumb|401x401px]]&lt;br /&gt;
You can either type the path relative to the Assets folder or use the file browser with the dedicated button.&lt;br /&gt;
&lt;br /&gt;
The label underneath the text field hold the actual, unique path that will be used for the impostor. &lt;br /&gt;
&lt;br /&gt;
If the path contains one or more non-existing directories, they will be created automatically at baking time.&lt;br /&gt;
&lt;br /&gt;
Note that no file nor directory is created before baking. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Post-baking adjustments ==&lt;br /&gt;
Both the Lit and Unlit impostor materials have a custom Shader GUI where you can perform advanced post-baking adjustments.&lt;br /&gt;
[[File:Image 2024-02-06 190047781.png|center|thumb|865x865px]]&lt;br /&gt;
&lt;br /&gt;
=== Billboarding ===&lt;br /&gt;
The billboarding effect consists in making the quad face the camera at any time. This is performed in the vertex shader stage. &lt;br /&gt;
&lt;br /&gt;
* You can disable it with the dedicated toggle.&lt;br /&gt;
* Clamp Latitude will stop the vertical billboard effect if the view angle gets out of the latitudinal range. The horizontal billboarding will remain.&lt;br /&gt;
* Z Offset can get the a impostor closer from the camera. Really useful to get the most out of the LODGroup's crossfading effect, or to adapt the size at closer range without altering longer ranges.&lt;br /&gt;
&lt;br /&gt;
=== Surface ===&lt;br /&gt;
Due to the lack of smoothness, metallic and occlusion maps, it is sometimes required to tweak some surface parameters to match the source objects better.&lt;br /&gt;
* The Brightness slider can increase/decrease the albedo power.&lt;br /&gt;
* The Saturation slider can increase/decrease the color saturation.&lt;br /&gt;
* The Smoothness and Occlusion sliders work the same way than the default diffuse material. &lt;br /&gt;
* The Metallic slider is multiplied with the computed metallic map.&lt;br /&gt;
* The Curvature Occlusion slider applies an additionnal occlusion in rifts, and sharp angles, to estimate self-shades. Can create a gray outline on some objects.&lt;br /&gt;
&lt;br /&gt;
=== Contours ===&lt;br /&gt;
Impostors use opaque materials. To get the contours right we use alpha clipping to discard pixels that are not representing the object on each POV. The contours are usually fine out-of-the-box, but sometimes it is required to adjust a few settings.&lt;br /&gt;
* The Cutout slider can increase/decrease the sharpness of the alpha clipping geometry. You should not go higher than 0.5 to avoid cropping some important features.&lt;br /&gt;
&lt;br /&gt;
* The Interpolate toggle turns On/Off impostor bilinear interpolation smoothing. Interpolation removes the snapping effect, but adds blur. Note that interpolation adds shader complexity.&lt;br /&gt;
&lt;br /&gt;
* The Dithering Fade toggle turns On/Off Dithering fading on the edges of the impostor. Independant from the LODGroup crossfade effect.&lt;br /&gt;
[[File:2024-02-14-23-15-13.gif|center|From left to right: The original model, interpolation disabled, interpolation enabled.|frame]]&lt;br /&gt;
&lt;br /&gt;
=== Geometry ===&lt;br /&gt;
These settings are theoritically not needed but give additionnal freedom to advanced users.&lt;br /&gt;
* The Yaw/Elevation offset sliders make the object virtually rotate on the Horizontal/Vertical axis respectively. &lt;br /&gt;
&lt;br /&gt;
=== Advanced Options ===&lt;br /&gt;
You can control the Render Queue, Double sided Global Illumation and GPU instancing, like the default surface shader. &lt;br /&gt;
&lt;br /&gt;
== Post-Baking Memory Optimization ==&lt;br /&gt;
Since version 1.2.0, Mirage embeds an Impostor Optimizer (&amp;lt;code&amp;gt;Window-&amp;gt;Mirage-&amp;gt;Impostor Optimizer&amp;lt;/code&amp;gt;) to change the textures atlases formats and downsample Albedo, Normal and Mask atlases independantly. This is especially useful to build on iOS as DXT compression is not supported on this platform, or to reduce the final build size.&lt;br /&gt;
[[File:Image 2024-08-30 171822247.png|center|thumb]]&lt;br /&gt;
Please be aware that these optimizations change the prefabs directly thus are NOT REVERSIBLE, it is advised to fine-tune on impostors copies first. &lt;br /&gt;
&lt;br /&gt;
You can have as many impostors as you want in the drop zone, the same settings will be applied to all of them sequentially.  &lt;br /&gt;
&lt;br /&gt;
== Compatible objects ==&lt;br /&gt;
Mirage Impostors are compatible with any object with a MeshFilter and a MeshRenderer attached. &lt;br /&gt;
&lt;br /&gt;
Note that translations (on all axes), scaling (on all axes) and rotation (around the vertical axis only) are supported. &lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
Due to their nature, Mirage's impostors have their few limitations.&lt;br /&gt;
&lt;br /&gt;
* Full rotation compatibility : as said just above, the impostors won't be rotated around X and Z axes even if their parent does. &lt;br /&gt;
* Lossy scale : Mirage uses the transforms [https://docs.unity3d.com/ScriptReference/Transform-lossyScale.html lossyScale] of the source objects. If the source objects are skewed by nested non uniform scaling a rotation, the impostor may be a appear close from but source but unskewed.&lt;br /&gt;
* Shadows : Mirage impostors are compatible with shadows but they are not physically correct since it only projects the alpha clipped quad instead of having a dedicated shadow pass. It means shadow will be correct if the light comes from the front or the back but not the sides of the impostor. This is a simplicity choice, since correct shadow would add a GPU-intensive shader pass and shadows are usually not even visible from the impostor nominal distance. Moreover, it keeps Mirage natively pipeline independant since shader graph is not yet designed to add custom passes.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Didn't find what you were searching for?&lt;br /&gt;
&lt;br /&gt;
Feel free to contact me by email or on my discord channel.&lt;br /&gt;
&lt;br /&gt;
[mailto:support@leochaumartin.com support@leochaumartin.com]&lt;br /&gt;
&lt;br /&gt;
https://discord.gg/kYwzdvAt8q&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://www.gamedeveloper.com/programming/dynamic-2d-imposters-a-simple-efficient-directx-9-implementation&lt;br /&gt;
&lt;br /&gt;
https://calcifer.org/kenneth-christiansen/ComputerScience/imposters.pdf&lt;br /&gt;
&lt;br /&gt;
https://developer.nvidia.com/gpugems/gpugems3/part-iv-image-effects/chapter-21-true-impostors&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=File:Mirage_Pro_Runtime_Baking.png&amp;diff=65665</id>
		<title>File:Mirage Pro Runtime Baking.png</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=File:Mirage_Pro_Runtime_Baking.png&amp;diff=65665"/>
		<updated>2025-11-25T18:05:09Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mirage Pro Runtime Baking&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=File:Autolod_MAN3.png&amp;diff=65664</id>
		<title>File:Autolod MAN3.png</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=File:Autolod_MAN3.png&amp;diff=65664"/>
		<updated>2025-08-15T10:36:29Z</updated>

		<summary type="html">&lt;p&gt;Lch: Lch uploaded a new version of File:Autolod MAN3.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The AutoLOD editor window with custom settings&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=AutoLOD&amp;diff=65663</id>
		<title>AutoLOD</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=AutoLOD&amp;diff=65663"/>
		<updated>2025-08-15T10:34:55Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AutoLOD is a very simple tool that will generate a LOD group with any 3D&lt;br /&gt;
&lt;br /&gt;
object from your scene. It will automatically compute simplified version of your&lt;br /&gt;
[[File:Image 2023-10-30 141342560.png|thumb|606x606px|The AutoLOD editor window under several states of customization]]&lt;br /&gt;
meshes using decimation.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
The whole package is contained in the AutoLOD folder resulting from the import. You can move it wherever you want, but it is recommended to keep the same folder structure.&lt;br /&gt;
&lt;br /&gt;
== How to use ==&lt;br /&gt;
AutoLOD consists in an editor window. You can open it via &amp;lt;code&amp;gt;Window-&amp;gt;AutoLOD-&amp;gt;MeshDecimator&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[File:How_to_open_the_window.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
Put the object(s) to be processed into the ”targets” area. Please note that a &amp;lt;code&amp;gt;MeshRenderer&amp;lt;/code&amp;gt; or a &amp;lt;code&amp;gt;SkinnedMeshRenderer&amp;lt;/code&amp;gt; is required otherwise the object won't be added.&lt;br /&gt;
[[File:AutoLOD_MAN2.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
By default, the same presets will be applied to every renderer in the list.&lt;br /&gt;
&lt;br /&gt;
You can customize these presets in the Common Settings section.&lt;br /&gt;
&lt;br /&gt;
You can also customize per-object settings by folding out targets in the list.&lt;br /&gt;
[[File:Autolod_MAN3.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
Both settings panels are identical, meaning that each object is fully customizable independantly from others or from the common settings.&lt;br /&gt;
&lt;br /&gt;
You control how to configure the native LODGroup creation. You can still change it manually when the process is over. &lt;br /&gt;
[[File:AutoReductionRate.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the Auto toggle is activated next to the Reduction Rate slider, changing the LOD relative transition height will set an appropriate reduction rate. &lt;br /&gt;
[[File:Autolod_MAN5.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
Since 4.0, decimated meshes will be saved to the assets, to the given path. If the path does not exist, the program will automatically create it for you.&lt;br /&gt;
&lt;br /&gt;
When you are ready, just click on the button &amp;lt;code&amp;gt;Generate LOD&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* Minimalist interface and really easy to use&lt;br /&gt;
* Exposes 2 backends to the users : a fast to be used for prototyping of dynamic usage, and a quality for higher quality outputs (since version 5.0)&lt;br /&gt;
* Works in both edit and play mode&lt;br /&gt;
* Works on prefabs instances (no need to unpack them)&lt;br /&gt;
* You can change the default export path from &amp;lt;code&amp;gt;Edit-&amp;gt;Preferences-&amp;gt;AutoLOD Settings&amp;lt;/code&amp;gt;&lt;br /&gt;
* Generates up to 8 LOD for a single object&lt;br /&gt;
* Decimates UVs (from uv1 to uv4) and bone weights too.&lt;br /&gt;
* Compatible with sub-meshes&lt;br /&gt;
* Compatible with SkinnedMeshRenderers with bones &lt;br /&gt;
* Blendshapes interpolation&lt;br /&gt;
* Can be used for simple distance culling too&lt;br /&gt;
* Fully compatible with any render pipeline and any unity version since 2020.3 LTS.&lt;br /&gt;
&lt;br /&gt;
== Backends ==&lt;br /&gt;
Since AutoLOD 5.0, you can now choose which backend you want to use between the fast or high quality. Both backends implement Fast quadric mesh simplification but the high quality preserves better UVs and preserve borders. &lt;br /&gt;
[[File:AutoLOD Backends.png|alt=Demonstration of AutoLOD embedded fast and HQ decimation backends|thumb|514x514px|AutoLOD embedded fast and HQ decimation backends|none]]&lt;br /&gt;
&lt;br /&gt;
== Runtime API ==&lt;br /&gt;
All the following methods are part of the &amp;lt;code&amp;gt;AutoLOD.MeshDecimator&amp;lt;/code&amp;gt; namespace.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;void CFastMeshDecimator.Initialize()&amp;lt;/code&amp;gt;&lt;br /&gt;
: Initializes the MeshDecimator with the Fast backend. This method sets up necessary components or variables required before the decimation process begins.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Mesh CFastMeshDecimator.DecimateMesh(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Decimates the provided mesh (''sourceMesh'') to a specified number of faces (''targetFaceCount'') using the Fast backend.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;static Mesh CFastMeshDecimator.DecimateMeshStatic(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Provides a static method to decimate a mesh without needing an instance of the FastMeshDecimator class. It takes a mesh (''sourceMesh'') and decimates it to the specified number of faces (''targetFaceCount'') using the Fast backend.&lt;br /&gt;
:&lt;br /&gt;
: &amp;lt;code&amp;gt;'''Task&amp;lt;Mesh&amp;gt; CFastMeshDecimator.DecimateMeshAsync(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)'''&amp;lt;/code&amp;gt;&lt;br /&gt;
: Provides a static method to decimate a mesh asynchroneously using the Fast backend.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;void CQualityMeshDecimator.Initialize()&amp;lt;/code&amp;gt;&lt;br /&gt;
: Initializes the MeshDecimator with the High Quality backend. This method sets up necessary components or variables required before the decimation process begins.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Mesh CQualityMeshDecimator.DecimateMesh(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Decimates the provided mesh (''sourceMesh'') to a specified number of faces (''targetFaceCount'') using the Quality backend.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;static Mesh CQualityMeshDecimator.DecimateMeshStatic(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Provides a static method to decimate a mesh without needing an instance of the QualityMeshDecimator class. It takes a mesh (''sourceMesh'') and decimates it to the specified number of faces (''targetFaceCount'') using the Quality backend.&lt;br /&gt;
:&lt;br /&gt;
: &amp;lt;code&amp;gt;'''Task&amp;lt;Mesh&amp;gt; CQualityMeshDecimator.DecimateMeshAsync(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)'''&amp;lt;/code&amp;gt;&lt;br /&gt;
: Provides a static method to decimate a mesh asynchroneously using the Quality backend.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
== Alternative Workflow ==&lt;br /&gt;
There are scenarios where you may want '''a single LODGroup for several renderers''', for example a props cluster. AutoLOD 5.2 brought a LODGroup-oriented workflow for this usecase. Just add a LODGroup (preferably on a common parent to all renderers you want to include) and add all renderers you want to include in the cluster in the LOD0 level (required). From the contextual menu, you will be able to generate all the missing LOD levels. &lt;br /&gt;
[[File:AutoLODgroupWorkflow.png|alt=The new LODGroup oriented workflow|none|thumb|421x421px]]&lt;br /&gt;
The reduction rate will be proportional to the transition height you entered in each LOD level, following this formula: &amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;ReductionRate = 1/TransitionHeightRatio&amp;lt;/math&amp;gt;Both backends are available and a progress bar will keep you informled during the process.&lt;br /&gt;
&lt;br /&gt;
If you want to fine-tune some LODs specifically, just delete the LOD's renderers and regenerate from the contextual menu. The LODs that already have renderers will be ketp untouched.&lt;br /&gt;
&lt;br /&gt;
Please note that the meshes decimated using this method are saved in the default export folder that you can customize in the preferences &amp;lt;code&amp;gt;Edit-&amp;gt;Preferences-&amp;gt;AutoLOD Settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Some tips ==&lt;br /&gt;
&lt;br /&gt;
* A demo scene is provided in the Scene folder: click play and follow the instructions. The provided material in the scene should appear pink in LWRP/URP and HDRP. Feel free to upgrade the material to your render pipeline, or use your own material.&lt;br /&gt;
* Setting 1 on LOD Levels will just apply a distance culling (and an automatic decimation if the toggle is enabled).&lt;br /&gt;
* You can apply changes to a prefab instance, as long as the decimated mesh were saved to the Assets (otherwise the meshes will be missing, as they are stored in the scene data).&lt;br /&gt;
* You can undo the whole AutoLOD process with Edit -&amp;gt; Undo&lt;br /&gt;
* You can put several objects in the drag and drop area. AutoLOD will just add the valid ones to the list.&lt;br /&gt;
* You can add a MeshRenderer or SkinnedMeshRenderer from its context menu in the inspector&lt;br /&gt;
&lt;br /&gt;
== Warnings ==&lt;br /&gt;
&lt;br /&gt;
* Generation can take a long time for massive meshes. Unity will freeze during the process but a progress bar will provide some progress report. The progress bar is more precise for Unity 2021 and above than the previous releases.&lt;br /&gt;
* If the processed object has specific components attached to it, they will remain but make sure they still work properly. If they were using the attached MeshFilter or Renderer, they will probably be broken, but it should be easy to fix in most cases.&lt;br /&gt;
* Please check carefully which objects you put in AutoLOD and understand that there are just too many cases that can end up with bugs, especially with custom MonoBehaviour scripts.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Feel free to contact me via one of the social media available on the bottom of&lt;br /&gt;
&lt;br /&gt;
the AutoLOD editor window or via e-mail: [mailto:support@leochaumartin.com support@leochaumartin.com]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://github.com/Whinarn/MeshDecimator&lt;br /&gt;
&lt;br /&gt;
https://github.com/crescent3983/UnityMeshDecimation&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=File:AutoReductionRate.png&amp;diff=65662</id>
		<title>File:AutoReductionRate.png</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=File:AutoReductionRate.png&amp;diff=65662"/>
		<updated>2025-08-15T10:31:07Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Auto Reduction Rate introduced in AutoLOD 5.5.0&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=File:AutoLOD_MAN2.png&amp;diff=65661</id>
		<title>File:AutoLOD MAN2.png</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=File:AutoLOD_MAN2.png&amp;diff=65661"/>
		<updated>2025-08-15T10:19:10Z</updated>

		<summary type="html">&lt;p&gt;Lch: Lch uploaded a new version of File:AutoLOD MAN2.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The targets must be added in the green area&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=File:Image_2023-10-30_141342560.png&amp;diff=65660</id>
		<title>File:Image 2023-10-30 141342560.png</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=File:Image_2023-10-30_141342560.png&amp;diff=65660"/>
		<updated>2025-08-15T10:15:03Z</updated>

		<summary type="html">&lt;p&gt;Lch: Lch uploaded a new version of File:Image 2023-10-30 141342560.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The AutoLOD window under several states of customization&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=Seamless_Shadergraph_Extension&amp;diff=65659</id>
		<title>Seamless Shadergraph Extension</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=Seamless_Shadergraph_Extension&amp;diff=65659"/>
		<updated>2025-03-09T11:44:27Z</updated>

		<summary type="html">&lt;p&gt;Lch: /* Export node */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Shadergraph is a powerful node-based shader editor. Since unity 2021.2, shadergraph is available on any pipeline. This extension offers multiple additional nodes such as new nodes including a baking node to use shadergraph as a procedural texture baker.&lt;br /&gt;
&lt;br /&gt;
== Why this extension exists ? ==&lt;br /&gt;
Writing a custom shader for many object in a scene is not always great ; sometimes custom shaders can fail building on specific platforms, be unnecessarily slow and are not always cross pipeline compatible. This extension can transform shadergraph into a texture editor. The output of a texture editor is one or more '''textures'''.&lt;br /&gt;
&lt;br /&gt;
It means that you can '''use these textures with Unity default materials and get profit of the cross platform garantee''' and great performances on '''any pipeline'''.&lt;br /&gt;
&lt;br /&gt;
As the generated textures are PNG, you can use them in custom shaders too, or even non unity-related purposes such as making a logo.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
Once you purchased the asset on the asset store, you can import it using the package manager. Make sure to import shadergraph too if it is not the case already.&lt;br /&gt;
&lt;br /&gt;
This extension works on any pipeline, but the demo materials need to be updated to URP or HDRP if you don't use the built-in render pipeline. &lt;br /&gt;
&lt;br /&gt;
After importing the package, you should already see a new category called &amp;quot;Seamless&amp;quot; in the node list in shadergraph.&lt;br /&gt;
&lt;br /&gt;
== Billboard effect ==&lt;br /&gt;
[[File:BillboardNode.png|thumb|350x350px|The provided Billboard node]]&lt;br /&gt;
Seamless SGE embeds a billboard node to apply [[wikt:billboarding|billboarding]] on any object by displacing its vertices in the vertex shader.&lt;br /&gt;
&lt;br /&gt;
Once applied, the object will face the camera, either on all axes or just around the vertical axis according the &amp;quot;Mode&amp;quot; parameter.&lt;br /&gt;
&lt;br /&gt;
As this takes place in the shader, it will work with several cameras too.&lt;br /&gt;
&lt;br /&gt;
== Primitives ==&lt;br /&gt;
In order to bake tileable textures, it is necessary to use tileable primitive nodes. All the following nodes are the same than the ones in the original [[Seamless]] asset, please refer to it for more details.&lt;br /&gt;
&lt;br /&gt;
=== Voronoise ===&lt;br /&gt;
This noise [https://www.shadertoy.com/view/Xd23Dh created by Inigo Quilez] combines standard and voronoi noises in the same place. You can control how much it look look squared or voronoi-like, as well as sharp/blurry. &lt;br /&gt;
&lt;br /&gt;
=== Voronoi Ultimate ===&lt;br /&gt;
A more advanced Voronoi noise than the one provided by unity.&lt;br /&gt;
&lt;br /&gt;
=== Fractal Noise ===&lt;br /&gt;
Same as Voronoise, but the fractal version. you can apply up to 16 octaves with control over the gain and lacunarity.&lt;br /&gt;
 Fractal noises can be really resource consuming, better use it for baking purpose only.&lt;br /&gt;
&lt;br /&gt;
=== Fractal Warp ===&lt;br /&gt;
Same as fractal noise with [https://iquilezles.org/articles/warp/ domain warping] applied.&lt;br /&gt;
=== Faded Polygon ===&lt;br /&gt;
A simple polygon with an inner falloff control to blur the edges.&lt;br /&gt;
&lt;br /&gt;
=== Faded Rounded Rectangle ===&lt;br /&gt;
A simple rounded rectangle with control over the radius, and an outer falloff.&lt;br /&gt;
&lt;br /&gt;
=== Squircle ===&lt;br /&gt;
A [[wikipedia:Squircle|Squircle]] with control over the convexity and an inner falloff.&lt;br /&gt;
&lt;br /&gt;
=== Caustics Noise ===&lt;br /&gt;
A Fractal noise that looks like underwater caustics&lt;br /&gt;
&lt;br /&gt;
=== Erosion Noise ===&lt;br /&gt;
A Fractal noise that looks like mountains erosion&lt;br /&gt;
&lt;br /&gt;
== Filter nodes ==&lt;br /&gt;
&lt;br /&gt;
=== Curvature From Height ===&lt;br /&gt;
The curvature filter is a must-have to get a nice ambient occlusion estimation. &lt;br /&gt;
&lt;br /&gt;
=== Luminance ===&lt;br /&gt;
A simple RGB to Luminance helper node.&lt;br /&gt;
&lt;br /&gt;
== Export node ==&lt;br /&gt;
[[File:ExportNode .png|thumb|606x606px|The export/baking node]]&lt;br /&gt;
The export node is another useful node this extension provides. You can plug any output and bake the texture from the shader generated at this node. You can chose any size you want, including non-square or non-POT textures. &lt;br /&gt;
&lt;br /&gt;
You can chose if you want to include the alpha channel, and what type of texture it should be imported as (Default, Normal Map or Raw).&lt;br /&gt;
&lt;br /&gt;
Only PNG and RAW exports are supported yet.&lt;br /&gt;
&lt;br /&gt;
RAW format is natively compatible with terrain height-map import.&lt;br /&gt;
&lt;br /&gt;
== Support ==&lt;br /&gt;
I will be glad to help if you encounter any issue. &lt;br /&gt;
&lt;br /&gt;
[https://discord.gg/kYwzdvAt8q Discord]&lt;br /&gt;
&lt;br /&gt;
[mailto:support@leochaumartin.com Email]&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=AutoLOD&amp;diff=65658</id>
		<title>AutoLOD</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=AutoLOD&amp;diff=65658"/>
		<updated>2025-02-02T21:19:29Z</updated>

		<summary type="html">&lt;p&gt;Lch: /* Contact */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AutoLOD is a very simple tool that will generate a LOD group with any 3D&lt;br /&gt;
&lt;br /&gt;
object from your scene. It will automatically compute simplified version of your&lt;br /&gt;
[[File:Image 2023-10-30 141342560.png|thumb|606x606px|The AutoLOD editor window under several states of customization]]&lt;br /&gt;
meshes using decimation.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
The whole package is contained in the AutoLOD folder resulting from the import. You can move it wherever you want, but it is recommended to keep the same folder structure.&lt;br /&gt;
&lt;br /&gt;
== How to use ==&lt;br /&gt;
AutoLOD consists in an editor window. You can open it via &amp;lt;code&amp;gt;Window-&amp;gt;AutoLOD-&amp;gt;MeshDecimator&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[File:How_to_open_the_window.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
Put the object(s) to be processed into the ”targets” area. Please note that a Renderer is required otherwise the object cannot be added.&lt;br /&gt;
[[File:AutoLOD_MAN2.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
By default, the same presets will be applied to every renderer in the list.&lt;br /&gt;
&lt;br /&gt;
You can customize these presets in the Custom Settings section.&lt;br /&gt;
&lt;br /&gt;
You can also customize per-object settings by folding out targets in the list.&lt;br /&gt;
[[File:Autolod_MAN3.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
Both settings panels are identical, meaning that each object is fully customizable independantly from others or from the common settings.&lt;br /&gt;
[[File:Autolod_MAN4.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
The LODGroup Settings foldout let you control the LODGroup setup as it should be when created, but you can still change it manually when the process is over. You cannot interact with the LODGroup widget (which is NOT the actual widget, but just a representation), only the sliders LOD Levels, Seamless/Performant and Size Culling will influence it.&lt;br /&gt;
[[File:Autolod_MAN5.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
Since 4.0, decimated meshes will be saved to the assets, to the given path. If the path does not exist, the program will automatically create it for you.&lt;br /&gt;
&lt;br /&gt;
When you are ready, just click on the button &amp;lt;code&amp;gt;Generate LOD&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* Minimalist interface and really easy to use&lt;br /&gt;
* Exposes 2 backends to the users : a fast to be used for prototyping of dynamic usage, and a quality for higher quality outputs (since version 5.0)&lt;br /&gt;
* Works in both edit and play mode&lt;br /&gt;
* Works on prefabs instances (no need to unpack them)&lt;br /&gt;
* You can change the default export path from &amp;lt;code&amp;gt;Edit-&amp;gt;Preferences-&amp;gt;AutoLOD Settings&amp;lt;/code&amp;gt;&lt;br /&gt;
* Generates up to 8 LOD for a single object&lt;br /&gt;
* Decimates UVs (from uv1 to uv4) and bone weights too.&lt;br /&gt;
* Compatible with sub-meshes&lt;br /&gt;
* Compatible with SkinnedMeshRenderers with bones and blendshapes support&lt;br /&gt;
* Can be used for simple distance culling too&lt;br /&gt;
* Fully compatible with any render pipeline and any unity version since 2020.3 LTS.&lt;br /&gt;
&lt;br /&gt;
== Backends ==&lt;br /&gt;
Since AutoLOD 5.0, you can now choose which backend you want to use between the fast or high quality. Both backends implement Fast quadric mesh simplification but the high quality preserves better UVs and preserve borders. &lt;br /&gt;
[[File:AutoLOD Backends.png|alt=Demonstration of AutoLOD embedded fast and HQ decimation backends|thumb|514x514px|AutoLOD embedded fast and HQ decimation backends|none]]&lt;br /&gt;
&lt;br /&gt;
== Runtime API ==&lt;br /&gt;
All the following methods are part of the &amp;lt;code&amp;gt;AutoLOD.MeshDecimator&amp;lt;/code&amp;gt; namespace.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;void CFastMeshDecimator.Initialize()&amp;lt;/code&amp;gt;&lt;br /&gt;
: Initializes the MeshDecimator with the Fast backend. This method sets up necessary components or variables required before the decimation process begins.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Mesh CFastMeshDecimator.DecimateMesh(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Decimates the provided mesh (''sourceMesh'') to a specified number of faces (''targetFaceCount'') using the Fast backend.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;static Mesh CFastMeshDecimator.DecimateMeshStatic(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Provides a static method to decimate a mesh without needing an instance of the FastMeshDecimator class. It takes a mesh (''sourceMesh'') and decimates it to the specified number of faces (''targetFaceCount'') using the Fast backend.&lt;br /&gt;
:&lt;br /&gt;
: &amp;lt;code&amp;gt;'''Task&amp;lt;Mesh&amp;gt; CFastMeshDecimator.DecimateMeshAsync(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)'''&amp;lt;/code&amp;gt;&lt;br /&gt;
: Provides a static method to decimate a mesh asynchroneously using the Fast backend.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;void CQualityMeshDecimator.Initialize()&amp;lt;/code&amp;gt;&lt;br /&gt;
: Initializes the MeshDecimator with the High Quality backend. This method sets up necessary components or variables required before the decimation process begins.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Mesh CQualityMeshDecimator.DecimateMesh(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Decimates the provided mesh (''sourceMesh'') to a specified number of faces (''targetFaceCount'') using the Quality backend.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;static Mesh CQualityMeshDecimator.DecimateMeshStatic(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Provides a static method to decimate a mesh without needing an instance of the QualityMeshDecimator class. It takes a mesh (''sourceMesh'') and decimates it to the specified number of faces (''targetFaceCount'') using the Quality backend.&lt;br /&gt;
:&lt;br /&gt;
: &amp;lt;code&amp;gt;'''Task&amp;lt;Mesh&amp;gt; CQualityMeshDecimator.DecimateMeshAsync(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)'''&amp;lt;/code&amp;gt;&lt;br /&gt;
: Provides a static method to decimate a mesh asynchroneously using the Quality backend.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
== Alternative Workflow ==&lt;br /&gt;
There are scenarios where you may want '''a single LODGroup for several renderers''', for example a props cluster. AutoLOD 5.2 brought a LODGroup-oriented workflow for this usecase. Just add a LODGroup (preferably on a common parent to all renderers you want to include) and add all renderers you want to include in the cluster in the LOD0 level (required). From the contextual menu, you will be able to generate all the missing LOD levels. &lt;br /&gt;
[[File:AutoLODgroupWorkflow.png|alt=The new LODGroup oriented workflow|none|thumb|421x421px]]&lt;br /&gt;
The reduction rate will be proportional to the transition height you entered in each LOD level, following this formula: &amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;ReductionRate = 1/TransitionHeightRatio&amp;lt;/math&amp;gt;Both backends are available and a progress bar will keep you informled during the process.&lt;br /&gt;
&lt;br /&gt;
If you want to fine-tune some LODs specifically, just delete the LOD's renderers and regenerate from the contextual menu. The LODs that already have renderers will be ketp untouched.&lt;br /&gt;
&lt;br /&gt;
Please note that the meshes decimated using this method are saved in the default export folder that you can customize in the preferences &amp;lt;code&amp;gt;Edit-&amp;gt;Preferences-&amp;gt;AutoLOD Settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Some tips ==&lt;br /&gt;
&lt;br /&gt;
* A demo scene is provided in the Scene folder: click play and follow the instructions. The provided material in the scene should appear pink in LWRP/URP and HDRP. Feel free to upgrade the material to your render pipeline, or use your own material.&lt;br /&gt;
* Setting 1 on LOD Levels will just apply a distance culling (and an automatic decimation if the toggle is enabled).&lt;br /&gt;
* You can apply changes to a prefab instance, as long as the decimated mesh were saved to the Assets (otherwise the meshes will be missing, as they are stored in the scene data).&lt;br /&gt;
* You can undo the whole AutoLOD process with Edit -&amp;gt; Undo&lt;br /&gt;
* You can put several objects in the drag and drop area. AutoLOD will just add the valid ones to the list.&lt;br /&gt;
* You can add a MeshRenderer or SkinnedMeshRenderer from its context menu in the inspector&lt;br /&gt;
&lt;br /&gt;
== Warnings ==&lt;br /&gt;
&lt;br /&gt;
* Generation can take a long time for a whole scene. Unity will freeze during the process but a progress bar will provide some progress report. The progress bar is more precise for Unity 2020 and above than the previous releases.&lt;br /&gt;
* If the processed object has specific components attached to it, they will remain but make sure they still work properly. If they were using the attached MeshFilter or Renderer, they will probably be broken, but it should be easy to fix in most cases.&lt;br /&gt;
* Please check carefully which objects you put in AutoLOD and understand that there are just too many cases that can end up with bugs, especially with your MonoBehaviour scripts.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Feel free to contact me via one of the social media available on the bottom of&lt;br /&gt;
&lt;br /&gt;
the AutoLOD editor window or via e-mail: [mailto:support@leochaumartin.com support@leochaumartin.com]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://github.com/Whinarn/MeshDecimator&lt;br /&gt;
&lt;br /&gt;
https://github.com/crescent3983/UnityMeshDecimation&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=AutoLOD&amp;diff=65657</id>
		<title>AutoLOD</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=AutoLOD&amp;diff=65657"/>
		<updated>2025-02-02T21:19:11Z</updated>

		<summary type="html">&lt;p&gt;Lch: /* Runtime API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AutoLOD is a very simple tool that will generate a LOD group with any 3D&lt;br /&gt;
&lt;br /&gt;
object from your scene. It will automatically compute simplified version of your&lt;br /&gt;
[[File:Image 2023-10-30 141342560.png|thumb|606x606px|The AutoLOD editor window under several states of customization]]&lt;br /&gt;
meshes using decimation.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
The whole package is contained in the AutoLOD folder resulting from the import. You can move it wherever you want, but it is recommended to keep the same folder structure.&lt;br /&gt;
&lt;br /&gt;
== How to use ==&lt;br /&gt;
AutoLOD consists in an editor window. You can open it via &amp;lt;code&amp;gt;Window-&amp;gt;AutoLOD-&amp;gt;MeshDecimator&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[File:How_to_open_the_window.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
Put the object(s) to be processed into the ”targets” area. Please note that a Renderer is required otherwise the object cannot be added.&lt;br /&gt;
[[File:AutoLOD_MAN2.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
By default, the same presets will be applied to every renderer in the list.&lt;br /&gt;
&lt;br /&gt;
You can customize these presets in the Custom Settings section.&lt;br /&gt;
&lt;br /&gt;
You can also customize per-object settings by folding out targets in the list.&lt;br /&gt;
[[File:Autolod_MAN3.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
Both settings panels are identical, meaning that each object is fully customizable independantly from others or from the common settings.&lt;br /&gt;
[[File:Autolod_MAN4.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
The LODGroup Settings foldout let you control the LODGroup setup as it should be when created, but you can still change it manually when the process is over. You cannot interact with the LODGroup widget (which is NOT the actual widget, but just a representation), only the sliders LOD Levels, Seamless/Performant and Size Culling will influence it.&lt;br /&gt;
[[File:Autolod_MAN5.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
Since 4.0, decimated meshes will be saved to the assets, to the given path. If the path does not exist, the program will automatically create it for you.&lt;br /&gt;
&lt;br /&gt;
When you are ready, just click on the button &amp;lt;code&amp;gt;Generate LOD&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* Minimalist interface and really easy to use&lt;br /&gt;
* Exposes 2 backends to the users : a fast to be used for prototyping of dynamic usage, and a quality for higher quality outputs (since version 5.0)&lt;br /&gt;
* Works in both edit and play mode&lt;br /&gt;
* Works on prefabs instances (no need to unpack them)&lt;br /&gt;
* You can change the default export path from &amp;lt;code&amp;gt;Edit-&amp;gt;Preferences-&amp;gt;AutoLOD Settings&amp;lt;/code&amp;gt;&lt;br /&gt;
* Generates up to 8 LOD for a single object&lt;br /&gt;
* Decimates UVs (from uv1 to uv4) and bone weights too.&lt;br /&gt;
* Compatible with sub-meshes&lt;br /&gt;
* Compatible with SkinnedMeshRenderers with bones and blendshapes support&lt;br /&gt;
* Can be used for simple distance culling too&lt;br /&gt;
* Fully compatible with any render pipeline and any unity version since 2020.3 LTS.&lt;br /&gt;
&lt;br /&gt;
== Backends ==&lt;br /&gt;
Since AutoLOD 5.0, you can now choose which backend you want to use between the fast or high quality. Both backends implement Fast quadric mesh simplification but the high quality preserves better UVs and preserve borders. &lt;br /&gt;
[[File:AutoLOD Backends.png|alt=Demonstration of AutoLOD embedded fast and HQ decimation backends|thumb|514x514px|AutoLOD embedded fast and HQ decimation backends|none]]&lt;br /&gt;
&lt;br /&gt;
== Runtime API ==&lt;br /&gt;
All the following methods are part of the &amp;lt;code&amp;gt;AutoLOD.MeshDecimator&amp;lt;/code&amp;gt; namespace.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;void CFastMeshDecimator.Initialize()&amp;lt;/code&amp;gt;&lt;br /&gt;
: Initializes the MeshDecimator with the Fast backend. This method sets up necessary components or variables required before the decimation process begins.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Mesh CFastMeshDecimator.DecimateMesh(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Decimates the provided mesh (''sourceMesh'') to a specified number of faces (''targetFaceCount'') using the Fast backend.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;static Mesh CFastMeshDecimator.DecimateMeshStatic(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Provides a static method to decimate a mesh without needing an instance of the FastMeshDecimator class. It takes a mesh (''sourceMesh'') and decimates it to the specified number of faces (''targetFaceCount'') using the Fast backend.&lt;br /&gt;
:&lt;br /&gt;
: &amp;lt;code&amp;gt;'''Task&amp;lt;Mesh&amp;gt; CFastMeshDecimator.DecimateMeshAsync(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)'''&amp;lt;/code&amp;gt;&lt;br /&gt;
: Provides a static method to decimate a mesh asynchroneously using the Fast backend.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;void CQualityMeshDecimator.Initialize()&amp;lt;/code&amp;gt;&lt;br /&gt;
: Initializes the MeshDecimator with the High Quality backend. This method sets up necessary components or variables required before the decimation process begins.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Mesh CQualityMeshDecimator.DecimateMesh(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Decimates the provided mesh (''sourceMesh'') to a specified number of faces (''targetFaceCount'') using the Quality backend.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;static Mesh CQualityMeshDecimator.DecimateMeshStatic(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Provides a static method to decimate a mesh without needing an instance of the QualityMeshDecimator class. It takes a mesh (''sourceMesh'') and decimates it to the specified number of faces (''targetFaceCount'') using the Quality backend.&lt;br /&gt;
:&lt;br /&gt;
: &amp;lt;code&amp;gt;'''Task&amp;lt;Mesh&amp;gt; CQualityMeshDecimator.DecimateMeshAsync(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)'''&amp;lt;/code&amp;gt;&lt;br /&gt;
: Provides a static method to decimate a mesh asynchroneously using the Quality backend.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
== Alternative Workflow ==&lt;br /&gt;
There are scenarios where you may want '''a single LODGroup for several renderers''', for example a props cluster. AutoLOD 5.2 brought a LODGroup-oriented workflow for this usecase. Just add a LODGroup (preferably on a common parent to all renderers you want to include) and add all renderers you want to include in the cluster in the LOD0 level (required). From the contextual menu, you will be able to generate all the missing LOD levels. &lt;br /&gt;
[[File:AutoLODgroupWorkflow.png|alt=The new LODGroup oriented workflow|none|thumb|421x421px]]&lt;br /&gt;
The reduction rate will be proportional to the transition height you entered in each LOD level, following this formula: &amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;ReductionRate = 1/TransitionHeightRatio&amp;lt;/math&amp;gt;Both backends are available and a progress bar will keep you informled during the process.&lt;br /&gt;
&lt;br /&gt;
If you want to fine-tune some LODs specifically, just delete the LOD's renderers and regenerate from the contextual menu. The LODs that already have renderers will be ketp untouched.&lt;br /&gt;
&lt;br /&gt;
Please note that the meshes decimated using this method are saved in the default export folder that you can customize in the preferences &amp;lt;code&amp;gt;Edit-&amp;gt;Preferences-&amp;gt;AutoLOD Settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Some tips ==&lt;br /&gt;
&lt;br /&gt;
* A demo scene is provided in the Scene folder: click play and follow the instructions. The provided material in the scene should appear pink in LWRP/URP and HDRP. Feel free to upgrade the material to your render pipeline, or use your own material.&lt;br /&gt;
* Setting 1 on LOD Levels will just apply a distance culling (and an automatic decimation if the toggle is enabled).&lt;br /&gt;
* You can apply changes to a prefab instance, as long as the decimated mesh were saved to the Assets (otherwise the meshes will be missing, as they are stored in the scene data).&lt;br /&gt;
* You can undo the whole AutoLOD process with Edit -&amp;gt; Undo&lt;br /&gt;
* You can put several objects in the drag and drop area. AutoLOD will just add the valid ones to the list.&lt;br /&gt;
* You can add a MeshRenderer or SkinnedMeshRenderer from its context menu in the inspector&lt;br /&gt;
&lt;br /&gt;
== Warnings ==&lt;br /&gt;
&lt;br /&gt;
* Generation can take a long time for a whole scene. Unity will freeze during the process but a progress bar will provide some progress report. The progress bar is more precise for Unity 2020 and above than the previous releases.&lt;br /&gt;
* If the processed object has specific components attached to it, they will remain but make sure they still work properly. If they were using the attached MeshFilter or Renderer, they will probably be broken, but it should be easy to fix in most cases.&lt;br /&gt;
* Please check carefully which objects you put in AutoLOD and understand that there are just too many cases that can end up with bugs, especially with your MonoBehaviour scripts.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Feel free to contact me via one of the social media availbale on the bottom of&lt;br /&gt;
&lt;br /&gt;
the AutoLOD editor window or via e-mail: [mailto:support@leochaumartin.com support@leochaumartin.com]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://github.com/Whinarn/MeshDecimator&lt;br /&gt;
&lt;br /&gt;
https://github.com/crescent3983/UnityMeshDecimation&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=Seamless_Shadergraph_Extension&amp;diff=65656</id>
		<title>Seamless Shadergraph Extension</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=Seamless_Shadergraph_Extension&amp;diff=65656"/>
		<updated>2025-02-02T20:43:07Z</updated>

		<summary type="html">&lt;p&gt;Lch: /* Primitives */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Shadergraph is a powerful node-based shader editor. Since unity 2021.2, shadergraph is available on any pipeline. This extension offers multiple additional nodes such as new nodes including a baking node to use shadergraph as a procedural texture baker.&lt;br /&gt;
&lt;br /&gt;
== Why this extension exists ? ==&lt;br /&gt;
Writing a custom shader for many object in a scene is not always great ; sometimes custom shaders can fail building on specific platforms, be unnecessarily slow and are not always cross pipeline compatible. This extension can transform shadergraph into a texture editor. The output of a texture editor is one or more '''textures'''.&lt;br /&gt;
&lt;br /&gt;
It means that you can '''use these textures with Unity default materials and get profit of the cross platform garantee''' and great performances on '''any pipeline'''.&lt;br /&gt;
&lt;br /&gt;
As the generated textures are PNG, you can use them in custom shaders too, or even non unity-related purposes such as making a logo.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
Once you purchased the asset on the asset store, you can import it using the package manager. Make sure to import shadergraph too if it is not the case already.&lt;br /&gt;
&lt;br /&gt;
This extension works on any pipeline, but the demo materials need to be updated to URP or HDRP if you don't use the built-in render pipeline. &lt;br /&gt;
&lt;br /&gt;
After importing the package, you should already see a new category called &amp;quot;Seamless&amp;quot; in the node list in shadergraph.&lt;br /&gt;
&lt;br /&gt;
== Billboard effect ==&lt;br /&gt;
[[File:BillboardNode.png|thumb|350x350px|The provided Billboard node]]&lt;br /&gt;
Seamless SGE embeds a billboard node to apply [[wikt:billboarding|billboarding]] on any object by displacing its vertices in the vertex shader.&lt;br /&gt;
&lt;br /&gt;
Once applied, the object will face the camera, either on all axes or just around the vertical axis according the &amp;quot;Mode&amp;quot; parameter.&lt;br /&gt;
&lt;br /&gt;
As this takes place in the shader, it will work with several cameras too.&lt;br /&gt;
&lt;br /&gt;
== Primitives ==&lt;br /&gt;
In order to bake tileable textures, it is necessary to use tileable primitive nodes. All the following nodes are the same than the ones in the original [[Seamless]] asset, please refer to it for more details.&lt;br /&gt;
&lt;br /&gt;
=== Voronoise ===&lt;br /&gt;
This noise [https://www.shadertoy.com/view/Xd23Dh created by Inigo Quilez] combines standard and voronoi noises in the same place. You can control how much it look look squared or voronoi-like, as well as sharp/blurry. &lt;br /&gt;
&lt;br /&gt;
=== Voronoi Ultimate ===&lt;br /&gt;
A more advanced Voronoi noise than the one provided by unity.&lt;br /&gt;
&lt;br /&gt;
=== Fractal Noise ===&lt;br /&gt;
Same as Voronoise, but the fractal version. you can apply up to 16 octaves with control over the gain and lacunarity.&lt;br /&gt;
 Fractal noises can be really resource consuming, better use it for baking purpose only.&lt;br /&gt;
&lt;br /&gt;
=== Fractal Warp ===&lt;br /&gt;
Same as fractal noise with [https://iquilezles.org/articles/warp/ domain warping] applied.&lt;br /&gt;
=== Faded Polygon ===&lt;br /&gt;
A simple polygon with an inner falloff control to blur the edges.&lt;br /&gt;
&lt;br /&gt;
=== Faded Rounded Rectangle ===&lt;br /&gt;
A simple rounded rectangle with control over the radius, and an outer falloff.&lt;br /&gt;
&lt;br /&gt;
=== Squircle ===&lt;br /&gt;
A [[wikipedia:Squircle|Squircle]] with control over the convexity and an inner falloff.&lt;br /&gt;
&lt;br /&gt;
=== Caustics Noise ===&lt;br /&gt;
A Fractal noise that looks like underwater caustics&lt;br /&gt;
&lt;br /&gt;
=== Erosion Noise ===&lt;br /&gt;
A Fractal noise that looks like mountains erosion&lt;br /&gt;
&lt;br /&gt;
== Filter nodes ==&lt;br /&gt;
&lt;br /&gt;
=== Curvature From Height ===&lt;br /&gt;
The curvature filter is a must-have to get a nice ambient occlusion estimation. &lt;br /&gt;
&lt;br /&gt;
=== Luminance ===&lt;br /&gt;
A simple RGB to Luminance helper node.&lt;br /&gt;
&lt;br /&gt;
== Export node ==&lt;br /&gt;
[[File:ExportNode .png|thumb|606x606px|The export/baking node]]&lt;br /&gt;
The export node is the most useful node this extension provides. You can plug any output and bake the texture from the shader generated at this node. You can chose any size you want, including non-square or non-POT textures. &lt;br /&gt;
&lt;br /&gt;
You can chose if you want to include the alpha channel, and what type of texture it should imported as (Default or Normal Map).&lt;br /&gt;
&lt;br /&gt;
Only PNG exports are supported yet.&lt;br /&gt;
&lt;br /&gt;
== Support ==&lt;br /&gt;
I will be glad to help if you encounter any issue. &lt;br /&gt;
&lt;br /&gt;
[https://discord.gg/kYwzdvAt8q Discord]&lt;br /&gt;
&lt;br /&gt;
[mailto:support@leochaumartin.com Email]&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=65655</id>
		<title>Mirage</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=65655"/>
		<updated>2024-08-30T16:22:35Z</updated>

		<summary type="html">&lt;p&gt;Lch: /* Post-baking adjustments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Setup ==&lt;br /&gt;
The whole package is contained in the Mirage folder resulting from the import but you can move it wherever you want.&lt;br /&gt;
&lt;br /&gt;
== What is an impostor ==&lt;br /&gt;
An impostor or imposter is a dynamically rendered billboard texture map used to give an illusion of 3D geometry in the distance. &lt;br /&gt;
&lt;br /&gt;
In the Mirage context, you can have as many objects as you want in a single impostor, and all the the points of view are stored into an abedo, normal and metallic maps. Smoothness or occlusion are not baked into textures yet but are still customizable on post baking options.&lt;br /&gt;
== How to bake your first impostor ==&lt;br /&gt;
&amp;lt;code&amp;gt;Mirage&amp;lt;/code&amp;gt; consists in a single editor window. You can open it via &amp;lt;code&amp;gt;Window-&amp;gt;Mirage-&amp;gt;Impostors&amp;lt;/code&amp;gt;. For a simple one-click impostor approach, drag and drop the common ancestor of all the objects you want to bake into target area and click on the &amp;lt;code&amp;gt;Generate Impostor&amp;lt;/code&amp;gt; button. &lt;br /&gt;
&lt;br /&gt;
You can also customize a lot of settings for a more advanced usage. There are 5 category foldouts that can expanded or hidden by clicking on their title. Even when hidden, they still provide basic information or controls on the right of the title. &lt;br /&gt;
&lt;br /&gt;
The following sections will provide detailed explaination of each category.[[File:Image 2024-02-06 164734156.png|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
=== Setup the target(s) ===&lt;br /&gt;
This category holds all the source object(s) information. Note that only one impostor can be baked at a time, so all the target will all be part of the same impostor. &lt;br /&gt;
For a simple approach, drag and drop the common ancestor in the dedicated field. Note that if you want to bake only one object the common ancestor can be the object itself or its parent. When the common ancestor is set, Mirage will automatically detect all the mesh filters in its children, recursively. You can check which mesh filters are included by expanding the section as following. Null or invalid objects will be ignored. &lt;br /&gt;
[[File:Image 2024-02-06 170842562.png|center|thumb|357x357px]]&lt;br /&gt;
You can also exclude some meshes or add some manually by dropping them into the area. If you change the mesh filters manually, the common ancestor will be updated accordingly. Note that '''a common ancestor is needed to bake an impostor'''. &lt;br /&gt;
&lt;br /&gt;
=== Quality Settings ===&lt;br /&gt;
This category is crucial and will have a direct impact on the visual quality of the impostor as it provides full control over the baking topology. This section should be paired with the &amp;lt;code&amp;gt;Information&amp;lt;/code&amp;gt; category that provides real-time visualization for an excellent and fast control over the baking topology.&lt;br /&gt;
[[File:Image 2024-02-06 172158522.png|center|thumb|483x483px]]&lt;br /&gt;
&lt;br /&gt;
==== Texture Size ====&lt;br /&gt;
As previously mentionned, Color, Normal and Metallic Maps are stored into square POT atlases. This field controls the resolution of these atlases, from 128x128 to 4096x4096. The &amp;lt;code&amp;gt;Estimated total size&amp;lt;/code&amp;gt; label provides the size of the whole impostor prefab after baking (with DXT compression) &lt;br /&gt;
&lt;br /&gt;
==== Sphere Type ====&lt;br /&gt;
&lt;br /&gt;
*'''UV sphere''': The default choice.  The UV sphere is based on a fixed number of longitude and latitude samples.  The coverage is denser at the poles.The UV Sphere is a solid choice in many use cases, with more versatility regarding partial sphere baking.&lt;br /&gt;
*'''Pseudo-Fibonacci sphere''': at an experimental stage.  Provides a homogeneous coverage. Not compatible with latitude interpolation in the impostor shader. Despite being homogeneous, the output impostor will look smooth near the equator, with more noticeable snaps or blur around the poles. Full sphere baking only.&lt;br /&gt;
&lt;br /&gt;
==== Longitude Samples ====&lt;br /&gt;
UV Sphere only. Holds the number of longitudinal samples. The higher the better for smooth horizontal rotation, at a cost of higher POV number thus lower resolution/POV in the atlas. All samples are equally spread around the 360 degrees.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Samples ====&lt;br /&gt;
UV Sphere only. Holds half of the number of latitudinal samples (equator excluded). This means that a 0 value will just bake around the equator. 1 will bake an additionnal sample on each side of the equator, and so on.&lt;br /&gt;
&lt;br /&gt;
The higher the better for smooth vertical rotation, at a cost of higher POV number thus lower resolution/POV in the atlas. &lt;br /&gt;
&lt;br /&gt;
==== Latitude Offset ====&lt;br /&gt;
UV Sphere only. Shifts the equator sample. Useful for partial spheres.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Step ====&lt;br /&gt;
UV Sphere only. Holds angular offset between two latitudinal samples. A small value will increase smoothness of vertical rotation, but may limit the global latitudinal range.  &lt;br /&gt;
&lt;br /&gt;
==== Density ====&lt;br /&gt;
Pseudo-Fibonacci sphere only. Controls the density of the sphere. The higher the better for smooth rotations in any direction, at a cost of higher POV number thus lower resolution/POV in the atlas.&lt;br /&gt;
&lt;br /&gt;
==== Lighting Method ====&lt;br /&gt;
&lt;br /&gt;
# '''Surface Estimation:''' Computes dedicated normal and metallic map atlases to get physically correct light reflections on the impostor. The recommended method. The baked impostor will use a lit surface shader.&lt;br /&gt;
# '''Use Scene Sun Source:''' Adds the sun source of the opened scene in the baking context. Can provide better results on single lit scenes, especially with intricate smoothness/occlusion materials. Uses significantly less memory per impostor. The baked impostor will use an unlit shader.&lt;br /&gt;
&lt;br /&gt;
==== Presets ====&lt;br /&gt;
You can add/load presets easily with the dedicated buttons. Gives an additional degree of freedom to match your workflow. A few relevant presets are already included such as 1-POV-billboard or different hemispheres. Importing a preset and modifying values won't modify the preset unless you explicitly export and replace it.&lt;br /&gt;
&lt;br /&gt;
=== Information ===&lt;br /&gt;
The whole information foldout is readonly. It provides useful visual feedback to help tweaking the previous category fields.&lt;br /&gt;
&lt;br /&gt;
[[File:Image 2024-02-06 180549368.png|center|thumb|426x426px]]&lt;br /&gt;
On the left column, some metrics are displayed. The values will appear in green is considered valid, orange when considered too low/high. Please note that these colors are purely informative and won't inhibit the impostor generation. &lt;br /&gt;
&lt;br /&gt;
* The total number of POV.  &lt;br /&gt;
** For UV Sphere Baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = S_{Long}*S_{Lat}&amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
** For Pseudo-Fibonacci Sphere baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = \sum_{l=-S_{Lat}/2}^{S_{Lat}/2}cos(\frac{2\pi.l}{S_{Lat}}).S_{Long} &amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The Atlas POV size. 15x15 means there are 15 POVs per line and per column.&lt;br /&gt;
* Single POV resolution&lt;br /&gt;
* The atlas coverage : if &amp;lt;math&amp;gt;\sqrt{N_{POV}}&amp;lt;/math&amp;gt; is an integer, the coverage will be 100% otherwise there will be blank slots in the atlas. 100% is better but not necessary.&lt;br /&gt;
* Unused memory : The estimated memory held by the blank slots in the grid. Will be 0 if the coverage is 100% &lt;br /&gt;
&lt;br /&gt;
On the right area stand 3 tabs for more visual information.&lt;br /&gt;
&lt;br /&gt;
* POVs : Visualize the Longitude / Latitude coverage. A great helper when tweaking the Quality Settings. You can orbit around with the mouse to see clearer.&lt;br /&gt;
* Layout : Visualize the Atlas  layout. Filled atlas slots will be green, blank will be red.&lt;br /&gt;
* Preview :  Visualize how pixelated your each single POV will be. Displays the actual objects entered in the Target foldout. You can orbit around with the mouse as well. &amp;lt;!-- Please note the snappiness/bluriness won't be previewed here. The area only shows your inputs layout in the impostor and the pixelization but does not stand for a contractual appearance of the ouput impostor. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LODGroup Settings ===&lt;br /&gt;
This category is not crucial since you can always modify it afterwards, but it can make you save a lot a time. If you just want to bake the impostor to a prefab without adding it to the scene, you can untick the field Automatic Setup.&lt;br /&gt;
[[File:Image 2024-02-06 183403606.png|center|thumb|394x394px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 4 possible scenarios for this area. &lt;br /&gt;
&lt;br /&gt;
* None of the input meshes are part of a LODGroup : A LODGroup will be added on the common ancestor. all the source renderers will be added in LOD0 and the impostor will be added in LOD1 following the given settings. A cross fading is added for smooth transitions.&lt;br /&gt;
* There is already a LODGroup but no impostors : The impostor will be added in an additional LOD level following the given parameters. Note that all the source renderers MUST belong to either no LOD or the same LOD level from the same LODGroup to avoid nested LODGroup errors.&lt;br /&gt;
* There is already a LODGroup with an impostor : The impostor will be replaced using the same relative height transition. Note that impostors are detected thanks to the ImpostorReference script attached to the LODGroup. If you want to have several impostors in the same LODGroup, just delete safely the ImpostorReference component before baking. Also, the previous impostor's prefab will not be deleted, only the instance in the scene will be replaced.&lt;br /&gt;
* There isn't any common ancestor for the input objects. Baking won't be possible.&lt;br /&gt;
&lt;br /&gt;
== Save Path ==&lt;br /&gt;
Impostors are saved as packed prefabs, embedding the quad mesh, the atlas(es) and the material. You can customize this path in this section.&lt;br /&gt;
[[File:Image 2024-02-06 184910768.png|center|thumb|401x401px]]&lt;br /&gt;
You can either type the path relative to the Assets folder or use the file browser with the dedicated button.&lt;br /&gt;
&lt;br /&gt;
The label underneath the text field hold the actual, unique path that will be used for the impostor. &lt;br /&gt;
&lt;br /&gt;
If the path contains one or more non-existing directories, they will be created automatically at baking time.&lt;br /&gt;
&lt;br /&gt;
Note that no file nor directory is created before baking. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Post-baking adjustments ==&lt;br /&gt;
Both the Lit and Unlit impostor materials have a custom Shader GUI where you can perform advanced post-baking adjustments.&lt;br /&gt;
[[File:Image 2024-02-06 190047781.png|center|thumb|865x865px]]&lt;br /&gt;
&lt;br /&gt;
=== Billboarding ===&lt;br /&gt;
The billboarding effect consists in making the quad face the camera at any time. This is performed in the vertex shader stage. &lt;br /&gt;
&lt;br /&gt;
* You can disable it with the dedicated toggle.&lt;br /&gt;
* Clamp Latitude will stop the vertical billboard effect if the view angle gets out of the latitudinal range. The horizontal billboarding will remain.&lt;br /&gt;
* Z Offset can get the a impostor closer from the camera. Really useful to get the most out of the LODGroup's crossfading effect, or to adapt the size at closer range without altering longer ranges.&lt;br /&gt;
&lt;br /&gt;
=== Surface ===&lt;br /&gt;
Due to the lack of smoothness, metallic and occlusion maps, it is sometimes required to tweak some surface parameters to match the source objects better.&lt;br /&gt;
* The Brightness slider can increase/decrease the albedo power.&lt;br /&gt;
* The Saturation slider can increase/decrease the color saturation.&lt;br /&gt;
* The Smoothness and Occlusion sliders work the same way than the default diffuse material. &lt;br /&gt;
* The Metallic slider is multiplied with the computed metallic map.&lt;br /&gt;
* The Curvature Occlusion slider applies an additionnal occlusion in rifts, and sharp angles, to estimate self-shades. Can create a gray outline on some objects.&lt;br /&gt;
&lt;br /&gt;
=== Contours ===&lt;br /&gt;
Impostors use opaque materials. To get the contours right we use alpha clipping to discard pixels that are not representing the object on each POV. The contours are usually fine out-of-the-box, but sometimes it is required to adjust a few settings.&lt;br /&gt;
* The Cutout slider can increase/decrease the sharpness of the alpha clipping geometry. You should not go higher than 0.5 to avoid cropping some important features.&lt;br /&gt;
&lt;br /&gt;
* The Interpolate toggle turns On/Off impostor bilinear interpolation smoothing. Interpolation removes the snapping effect, but adds blur. Note that interpolation adds shader complexity.&lt;br /&gt;
&lt;br /&gt;
* The Dithering Fade toggle turns On/Off Dithering fading on the edges of the impostor. Independant from the LODGroup crossfade effect.&lt;br /&gt;
[[File:2024-02-14-23-15-13.gif|center|From left to right: The original model, interpolation disabled, interpolation enabled.|frame]]&lt;br /&gt;
&lt;br /&gt;
=== Geometry ===&lt;br /&gt;
These settings are theoritically not needed but give additionnal freedom to advanced users.&lt;br /&gt;
* The Yaw/Elevation offset sliders make the object virtually rotate on the Horizontal/Vertical axis respectively. &lt;br /&gt;
&lt;br /&gt;
=== Advanced Options ===&lt;br /&gt;
You can control the Render Queue, Double sided Global Illumation and GPU instancing, like the default surface shader. &lt;br /&gt;
&lt;br /&gt;
== Post-Baking Memory Optimization ==&lt;br /&gt;
Since version 1.2.0, Mirage embeds an Impostor Optimizer (&amp;lt;code&amp;gt;Window-&amp;gt;Mirage-&amp;gt;Impostor Optimizer&amp;lt;/code&amp;gt;) to change the textures atlases formats and downsample Albedo, Normal and Mask atlases independantly. This is especially useful to build on iOS as DXT compression is not supported on this platform, or to reduce the final build size.&lt;br /&gt;
[[File:Image 2024-08-30 171822247.png|center|thumb]]&lt;br /&gt;
Please be aware that these optimizations change the prefabs directly thus are NOT REVERSIBLE, it is advised to fine-tune on impostors copies first. &lt;br /&gt;
&lt;br /&gt;
You can have as many impostors as you want in the drop zone, the same settings will be applied to all of them sequentially.  &lt;br /&gt;
&lt;br /&gt;
== Compatible objects ==&lt;br /&gt;
Mirage Impostors are compatible with any object with a MeshFilter and a MeshRenderer attached. &lt;br /&gt;
&lt;br /&gt;
Note that translations (on all axes), scaling (on all axes) and rotation (around the vertical axis only) are supported. &lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
Due to their nature, Mirage's impostors have their few limitations.&lt;br /&gt;
&lt;br /&gt;
* Full rotation compatibility : as said just above, the impostors won't be rotated around X and Z axes even if their parent does. &lt;br /&gt;
* Lossy scale : Mirage uses the transforms [https://docs.unity3d.com/ScriptReference/Transform-lossyScale.html lossyScale] of the source objects. If the source objects are skewed by nested non uniform scaling a rotation, the impostor may be a appear close from but source but unskewed.&lt;br /&gt;
* Shadows : Mirage impostors are compatible with shadows but they are not physically correct since it only projects the alpha clipped quad instead of having a dedicated shadow pass. It means shadow will be correct if the light comes from the front or the back but not the sides of the impostor. This is a simplicity choice, since correct shadow would add a GPU-intensive shader pass and shadows are usually not even visible from the impostor nominal distance. Moreover, it keeps Mirage natively pipeline independant since shader graph is not yet designed to add custom passes.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Didn't find what you were searching for?&lt;br /&gt;
&lt;br /&gt;
Feel free to contact me by email or on my discord channel.&lt;br /&gt;
&lt;br /&gt;
[mailto:support@leochaumartin.com support@leochaumartin.com]&lt;br /&gt;
&lt;br /&gt;
https://discord.gg/kYwzdvAt8q&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://www.gamedeveloper.com/programming/dynamic-2d-imposters-a-simple-efficient-directx-9-implementation&lt;br /&gt;
&lt;br /&gt;
https://calcifer.org/kenneth-christiansen/ComputerScience/imposters.pdf&lt;br /&gt;
&lt;br /&gt;
https://developer.nvidia.com/gpugems/gpugems3/part-iv-image-effects/chapter-21-true-impostors&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=File:Image_2024-08-30_171822247.png&amp;diff=65654</id>
		<title>File:Image 2024-08-30 171822247.png</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=File:Image_2024-08-30_171822247.png&amp;diff=65654"/>
		<updated>2024-08-30T16:18:43Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Mirage Optimizer Interface&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=AutoLOD&amp;diff=65653</id>
		<title>AutoLOD</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=AutoLOD&amp;diff=65653"/>
		<updated>2024-07-23T17:44:34Z</updated>

		<summary type="html">&lt;p&gt;Lch: /* Runtime API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AutoLOD is a very simple tool that will generate a LOD group with any 3D&lt;br /&gt;
&lt;br /&gt;
object from your scene. It will automatically compute simplified version of your&lt;br /&gt;
[[File:Image 2023-10-30 141342560.png|thumb|606x606px|The AutoLOD editor window under several states of customization]]&lt;br /&gt;
meshes using decimation.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
The whole package is contained in the AutoLOD folder resulting from the import. You can move it wherever you want, but it is recommended to keep the same folder structure.&lt;br /&gt;
&lt;br /&gt;
== How to use ==&lt;br /&gt;
AutoLOD consists in an editor window. You can open it via &amp;lt;code&amp;gt;Window-&amp;gt;AutoLOD-&amp;gt;MeshDecimator&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[File:How_to_open_the_window.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
Put the object(s) to be processed into the ”targets” area. Please note that a Renderer is required otherwise the object cannot be added.&lt;br /&gt;
[[File:AutoLOD_MAN2.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
By default, the same presets will be applied to every renderer in the list.&lt;br /&gt;
&lt;br /&gt;
You can customize these presets in the Custom Settings section.&lt;br /&gt;
&lt;br /&gt;
You can also customize per-object settings by folding out targets in the list.&lt;br /&gt;
[[File:Autolod_MAN3.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
Both settings panels are identical, meaning that each object is fully customizable independantly from others or from the common settings.&lt;br /&gt;
[[File:Autolod_MAN4.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
The LODGroup Settings foldout let you control the LODGroup setup as it should be when created, but you can still change it manually when the process is over. You cannot interact with the LODGroup widget (which is NOT the actual widget, but just a representation), only the sliders LOD Levels, Seamless/Performant and Size Culling will influence it.&lt;br /&gt;
[[File:Autolod_MAN5.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
Since 4.0, decimated meshes will be saved to the assets, to the given path. If the path does not exist, the program will automatically create it for you.&lt;br /&gt;
&lt;br /&gt;
When you are ready, just click on the button &amp;lt;code&amp;gt;Generate LOD&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* Minimalist interface and really easy to use&lt;br /&gt;
* Exposes 2 backends to the users : a fast to be used for prototyping of dynamic usage, and a quality for higher quality outputs (since version 5.0)&lt;br /&gt;
* Works in both edit and play mode&lt;br /&gt;
* Works on prefabs instances (no need to unpack them)&lt;br /&gt;
* You can change the default export path from &amp;lt;code&amp;gt;Edit-&amp;gt;Preferences-&amp;gt;AutoLOD Settings&amp;lt;/code&amp;gt;&lt;br /&gt;
* Generates up to 8 LOD for a single object&lt;br /&gt;
* Decimates UVs (from uv1 to uv4) and bone weights too.&lt;br /&gt;
* Compatible with sub-meshes&lt;br /&gt;
* Compatible with SkinnedMeshRenderers with bones and blendshapes support&lt;br /&gt;
* Can be used for simple distance culling too&lt;br /&gt;
* Fully compatible with any render pipeline and any unity version since 2020.3 LTS.&lt;br /&gt;
&lt;br /&gt;
== Backends ==&lt;br /&gt;
Since AutoLOD 5.0, you can now choose which backend you want to use between the fast or high quality. Both backends implement Fast quadric mesh simplification but the high quality preserves better UVs and preserve borders. &lt;br /&gt;
[[File:AutoLOD Backends.png|alt=Demonstration of AutoLOD embedded fast and HQ decimation backends|thumb|514x514px|AutoLOD embedded fast and HQ decimation backends|none]]&lt;br /&gt;
&lt;br /&gt;
== Runtime API ==&lt;br /&gt;
All the following methods are part of the &amp;lt;code&amp;gt;AutoLOD.MeshDecimator&amp;lt;/code&amp;gt; namespace.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;void CFastMeshDecimator.Initialize()&amp;lt;/code&amp;gt;&lt;br /&gt;
: Initializes the MeshDecimator with the Fast backend. This method sets up necessary components or variables required before the decimation process begins.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Mesh CFastMeshDecimator.DecimateMesh(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Decimates the provided mesh (''sourceMesh'') to a specified number of faces (''targetFaceCount'') using the Fast backend.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;static Mesh CFastMeshDecimator.DecimateMeshStatic(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Provides a static method to decimate a mesh without needing an instance of the FastMeshDecimator class. It takes a mesh (''sourceMesh'') and decimates it to the specified number of faces (''targetFaceCount'') using the Fast backend.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;void CQualityMeshDecimator.Initialize()&amp;lt;/code&amp;gt;&lt;br /&gt;
: Initializes the MeshDecimator with the High Quality backend. This method sets up necessary components or variables required before the decimation process begins.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Mesh CQualityMeshDecimator.DecimateMesh(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Decimates the provided mesh (''sourceMesh'') to a specified number of faces (''targetFaceCount'') using the Quality backend.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;static Mesh CQualityMeshDecimator.DecimateMeshStatic(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Provides a static method to decimate a mesh without needing an instance of the QualityMeshDecimator class. It takes a mesh (''sourceMesh'') and decimates it to the specified number of faces (''targetFaceCount'') using the Quality backend.&lt;br /&gt;
&lt;br /&gt;
== Alternative Workflow ==&lt;br /&gt;
There are scenarios where you may want '''a single LODGroup for several renderers''', for example a props cluster. AutoLOD 5.2 brought a LODGroup-oriented workflow for this usecase. Just add a LODGroup (preferably on a common parent to all renderers you want to include) and add all renderers you want to include in the cluster in the LOD0 level (required). From the contextual menu, you will be able to generate all the missing LOD levels. &lt;br /&gt;
[[File:AutoLODgroupWorkflow.png|alt=The new LODGroup oriented workflow|none|thumb|421x421px]]&lt;br /&gt;
The reduction rate will be proportional to the transition height you entered in each LOD level, following this formula: &amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;ReductionRate = 1/TransitionHeightRatio&amp;lt;/math&amp;gt;Both backends are available and a progress bar will keep you informled during the process.&lt;br /&gt;
&lt;br /&gt;
If you want to fine-tune some LODs specifically, just delete the LOD's renderers and regenerate from the contextual menu. The LODs that already have renderers will be ketp untouched.&lt;br /&gt;
&lt;br /&gt;
Please note that the meshes decimated using this method are saved in the default export folder that you can customize in the preferences &amp;lt;code&amp;gt;Edit-&amp;gt;Preferences-&amp;gt;AutoLOD Settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Some tips ==&lt;br /&gt;
&lt;br /&gt;
* A demo scene is provided in the Scene folder: click play and follow the instructions. The provided material in the scene should appear pink in LWRP/URP and HDRP. Feel free to upgrade the material to your render pipeline, or use your own material.&lt;br /&gt;
* Setting 1 on LOD Levels will just apply a distance culling (and an automatic decimation if the toggle is enabled).&lt;br /&gt;
* You can apply changes to a prefab instance, as long as the decimated mesh were saved to the Assets (otherwise the meshes will be missing, as they are stored in the scene data).&lt;br /&gt;
* You can undo the whole AutoLOD process with Edit -&amp;gt; Undo&lt;br /&gt;
* You can put several objects in the drag and drop area. AutoLOD will just add the valid ones to the list.&lt;br /&gt;
* You can add a MeshRenderer or SkinnedMeshRenderer from its context menu in the inspector&lt;br /&gt;
&lt;br /&gt;
== Warnings ==&lt;br /&gt;
&lt;br /&gt;
* Generation can take a long time for a whole scene. Unity will freeze during the process but a progress bar will provide some progress report. The progress bar is more precise for Unity 2020 and above than the previous releases.&lt;br /&gt;
* If the processed object has specific components attached to it, they will remain but make sure they still work properly. If they were using the attached MeshFilter or Renderer, they will probably be broken, but it should be easy to fix in most cases.&lt;br /&gt;
* Please check carefully which objects you put in AutoLOD and understand that there are just too many cases that can end up with bugs, especially with your MonoBehaviour scripts.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Feel free to contact me via one of the social media availbale on the bottom of&lt;br /&gt;
&lt;br /&gt;
the AutoLOD editor window or via e-mail: [mailto:support@leochaumartin.com support@leochaumartin.com]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://github.com/Whinarn/MeshDecimator&lt;br /&gt;
&lt;br /&gt;
https://github.com/crescent3983/UnityMeshDecimation&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=LC_Assets_Documentation&amp;diff=169</id>
		<title>LC Assets Documentation</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=LC_Assets_Documentation&amp;diff=169"/>
		<updated>2024-03-25T14:29:30Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&lt;br /&gt;
[[AutoLOD|'''AutoLOD - Mesh Decimator''']]&amp;lt;br&amp;gt;&lt;br /&gt;
[[AutoLOD Impostors|'''AutoLOD - Impostors''']]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Seamless|'''Seamless - Procedural Texture Builder''']]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Seamless Shadergraph Extension|'''Seamless - Shader Graph Extension''']]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Sampl|'''Sampl - Procedural Audio Clip Baker''']]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Mirage|'''Mirage''']]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=AutoLOD&amp;diff=168</id>
		<title>AutoLOD</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=AutoLOD&amp;diff=168"/>
		<updated>2024-03-23T17:17:37Z</updated>

		<summary type="html">&lt;p&gt;Lch: V5.2 - Added new LODGroup-oriented workflow&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AutoLOD is a very simple tool that will generate a LOD group with any 3D&lt;br /&gt;
&lt;br /&gt;
object from your scene. It will automatically compute simplified version of your&lt;br /&gt;
[[File:Image 2023-10-30 141342560.png|thumb|606x606px|The AutoLOD editor window under several states of customization]]&lt;br /&gt;
meshes using decimation.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
The whole package is contained in the AutoLOD folder resulting from the import. You can move it wherever you want, but it is recommended to keep the same folder structure.&lt;br /&gt;
&lt;br /&gt;
== How to use ==&lt;br /&gt;
AutoLOD consists in an editor window. You can open it via &amp;lt;code&amp;gt;Window-&amp;gt;AutoLOD-&amp;gt;MeshDecimator&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[File:How_to_open_the_window.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
Put the object(s) to be processed into the ”targets” area. Please note that a Renderer is required otherwise the object cannot be added.&lt;br /&gt;
[[File:AutoLOD_MAN2.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
By default, the same presets will be applied to every renderer in the list.&lt;br /&gt;
&lt;br /&gt;
You can customize these presets in the Custom Settings section.&lt;br /&gt;
&lt;br /&gt;
You can also customize per-object settings by folding out targets in the list.&lt;br /&gt;
[[File:Autolod_MAN3.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
Both settings panels are identical, meaning that each object is fully customizable independantly from others or from the common settings.&lt;br /&gt;
[[File:Autolod_MAN4.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
The LODGroup Settings foldout let you control the LODGroup setup as it should be when created, but you can still change it manually when the process is over. You cannot interact with the LODGroup widget (which is NOT the actual widget, but just a representation), only the sliders LOD Levels, Seamless/Performant and Size Culling will influence it.&lt;br /&gt;
[[File:Autolod_MAN5.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
Since 4.0, decimated meshes will be saved to the assets, to the given path. If the path does not exist, the program will automatically create it for you.&lt;br /&gt;
&lt;br /&gt;
When you are ready, just click on the button &amp;lt;code&amp;gt;Generate LOD&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* Minimalist interface and really easy to use&lt;br /&gt;
* Exposes 2 backends to the users : a fast to be used for prototyping of dynamic usage, and a quality for higher quality outputs (since version 5.0)&lt;br /&gt;
* Works in both edit and play mode&lt;br /&gt;
* Works on prefabs instances (no need to unpack them)&lt;br /&gt;
* You can change the default export path from &amp;lt;code&amp;gt;Edit-&amp;gt;Preferences-&amp;gt;AutoLOD Settings&amp;lt;/code&amp;gt;&lt;br /&gt;
* Generates up to 8 LOD for a single object&lt;br /&gt;
* Decimates UVs (from uv1 to uv4) and bone weights too.&lt;br /&gt;
* Compatible with sub-meshes&lt;br /&gt;
* Compatible with SkinnedMeshRenderers with bones and blendshapes support&lt;br /&gt;
* Can be used for simple distance culling too&lt;br /&gt;
* Fully compatible with any render pipeline and any unity version since 2020.3 LTS.&lt;br /&gt;
&lt;br /&gt;
== Backends ==&lt;br /&gt;
Since AutoLOD 5.0, you can now choose which backend you want to use between the fast or high quality. Both backends implement Fast quadric mesh simplification but the high quality preserves better UVs and preserve borders. &lt;br /&gt;
[[File:AutoLOD Backends.png|alt=Demonstration of AutoLOD embedded fast and HQ decimation backends|thumb|514x514px|AutoLOD embedded fast and HQ decimation backends]]&lt;br /&gt;
&lt;br /&gt;
== Runtime API ==&lt;br /&gt;
All the following methods are part of the &amp;lt;code&amp;gt;AutoLOD.MeshDecimator&amp;lt;/code&amp;gt; namespace.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;void CFastMeshDecimator.Initialize()&amp;lt;/code&amp;gt;&lt;br /&gt;
: Initializes the MeshDecimator with the Fast backend. This method sets up necessary components or variables required before the decimation process begins.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Mesh CFastMeshDecimator.DecimateMesh(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Decimates the provided mesh (''sourceMesh'') to a specified number of faces (''targetFaceCount'') using the Fast backend.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;static Mesh CFastMeshDecimator.DecimateMeshStatic(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Provides a static method to decimate a mesh without needing an instance of the FastMeshDecimator class. It takes a mesh (''sourceMesh'') and decimates it to the specified number of faces (''targetFaceCount'') using the Fast backend.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;void CQualityMeshDecimator.Initialize()&amp;lt;/code&amp;gt;&lt;br /&gt;
: Initializes the MeshDecimator with the High Quality backend. This method sets up necessary components or variables required before the decimation process begins.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Mesh CQualityMeshDecimator.DecimateMesh(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Decimates the provided mesh (''sourceMesh'') to a specified number of faces (''targetFaceCount'') using the Quality backend.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;static Mesh CQualityMeshDecimator.DecimateMeshStatic(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Provides a static method to decimate a mesh without needing an instance of the QualityMeshDecimator class. It takes a mesh (''sourceMesh'') and decimates it to the specified number of faces (''targetFaceCount'') using the Quality backend.&lt;br /&gt;
&lt;br /&gt;
== Alternative Workflow ==&lt;br /&gt;
There are scenarios where you may want '''a single LODGroup for several renderers''', for example a props cluster. AutoLOD 5.2 brought a LODGroup-oriented workflow for this usecase. Just add a LODGroup (preferably on a common parent to all renderers you want to include) and add all renderers you want to include in the cluster in the LOD0 level (required). From the contextual menu, you will be able to generate all the missing LOD levels. &lt;br /&gt;
[[File:AutoLODgroupWorkflow.png|alt=The new LODGroup oriented workflow|none|thumb|421x421px]]&lt;br /&gt;
The reduction rate will be proportional to the transition height you entered in each LOD level, following this formula: &amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;ReductionRate = 1/TransitionHeightRatio&amp;lt;/math&amp;gt;Both backends are available and a progress bar will keep you informled during the process.&lt;br /&gt;
&lt;br /&gt;
If you want to fine-tune some LODs specifically, just delete the LOD's renderers and regenerate from the contextual menu. The LODs that already have renderers will be ketp untouched.&lt;br /&gt;
&lt;br /&gt;
Please note that the meshes decimated using this method are saved in the default export folder that you can customize in the preferences &amp;lt;code&amp;gt;Edit-&amp;gt;Preferences-&amp;gt;AutoLOD Settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Some tips ==&lt;br /&gt;
&lt;br /&gt;
* A demo scene is provided in the Scene folder: click play and follow the instructions. The provided material in the scene should appear pink in LWRP/URP and HDRP. Feel free to upgrade the material to your render pipeline, or use your own material.&lt;br /&gt;
* Setting 1 on LOD Levels will just apply a distance culling (and an automatic decimation if the toggle is enabled).&lt;br /&gt;
* You can apply changes to a prefab instance, as long as the decimated mesh were saved to the Assets (otherwise the meshes will be missing, as they are stored in the scene data).&lt;br /&gt;
* You can undo the whole AutoLOD process with Edit -&amp;gt; Undo&lt;br /&gt;
* You can put several objects in the drag and drop area. AutoLOD will just add the valid ones to the list.&lt;br /&gt;
* You can add a MeshRenderer or SkinnedMeshRenderer from its context menu in the inspector&lt;br /&gt;
&lt;br /&gt;
== Warnings ==&lt;br /&gt;
&lt;br /&gt;
* Generation can take a long time for a whole scene. Unity will freeze during the process but a progress bar will provide some progress report. The progress bar is more precise for Unity 2020 and above than the previous releases.&lt;br /&gt;
* If the processed object has specific components attached to it, they will remain but make sure they still work properly. If they were using the attached MeshFilter or Renderer, they will probably be broken, but it should be easy to fix in most cases.&lt;br /&gt;
* Please check carefully which objects you put in AutoLOD and understand that there are just too many cases that can end up with bugs, especially with your MonoBehaviour scripts.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Feel free to contact me via one of the social media availbale on the bottom of&lt;br /&gt;
&lt;br /&gt;
the AutoLOD editor window or via e-mail: [mailto:support@leochaumartin.com support@leochaumartin.com]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://github.com/Whinarn/MeshDecimator&lt;br /&gt;
&lt;br /&gt;
https://github.com/crescent3983/UnityMeshDecimation&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=File:AutoLODgroupWorkflow.png&amp;diff=167</id>
		<title>File:AutoLODgroupWorkflow.png</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=File:AutoLODgroupWorkflow.png&amp;diff=167"/>
		<updated>2024-03-23T17:08:02Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The new LODGroup oriented workflow&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=166</id>
		<title>Mirage</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=166"/>
		<updated>2024-02-14T22:43:46Z</updated>

		<summary type="html">&lt;p&gt;Lch: /* Contact */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Setup ==&lt;br /&gt;
The whole package is contained in the Mirage folder resulting from the import but you can move it wherever you want.&lt;br /&gt;
&lt;br /&gt;
== What is an impostor ==&lt;br /&gt;
An impostor or imposter is a dynamically rendered billboard texture map used to give an illusion of 3D geometry in the distance. &lt;br /&gt;
&lt;br /&gt;
In the Mirage context, you can have as many objects as you want in a single impostor, and all the the points of view are stored into an abedo, normal and metallic maps. Smoothness or occlusion are not baked into textures yet but are still customizable on post baking options.&lt;br /&gt;
== How to bake your first impostor ==&lt;br /&gt;
&amp;lt;code&amp;gt;Mirage&amp;lt;/code&amp;gt; consists in a single editor window. You can open it via &amp;lt;code&amp;gt;Window-&amp;gt;Mirage-&amp;gt;Impostors&amp;lt;/code&amp;gt;. For a simple one-click impostor approach, drag and drop the common ancestor of all the objects you want to bake into target area and click on the &amp;lt;code&amp;gt;Generate Impostor&amp;lt;/code&amp;gt; button. &lt;br /&gt;
&lt;br /&gt;
You can also customize a lot of settings for a more advanced usage. There are 5 category foldouts that can expanded or hidden by clicking on their title. Even when hidden, they still provide basic information or controls on the right of the title. &lt;br /&gt;
&lt;br /&gt;
The following sections will provide detailed explaination of each category.[[File:Image 2024-02-06 164734156.png|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
=== Setup the target(s) ===&lt;br /&gt;
This category holds all the source object(s) information. Note that only one impostor can be baked at a time, so all the target will all be part of the same impostor. &lt;br /&gt;
For a simple approach, drag and drop the common ancestor in the dedicated field. Note that if you want to bake only one object the common ancestor can be the object itself or its parent. When the common ancestor is set, Mirage will automatically detect all the mesh filters in its children, recursively. You can check which mesh filters are included by expanding the section as following. Null or invalid objects will be ignored. &lt;br /&gt;
[[File:Image 2024-02-06 170842562.png|center|thumb|357x357px]]&lt;br /&gt;
You can also exclude some meshes or add some manually by dropping them into the area. If you change the mesh filters manually, the common ancestor will be updated accordingly. Note that '''a common ancestor is needed to bake an impostor'''. &lt;br /&gt;
&lt;br /&gt;
=== Quality Settings ===&lt;br /&gt;
This category is crucial and will have a direct impact on the visual quality of the impostor as it provides full control over the baking topology. This section should be paired with the &amp;lt;code&amp;gt;Information&amp;lt;/code&amp;gt; category that provides real-time visualization for an excellent and fast control over the baking topology.&lt;br /&gt;
[[File:Image 2024-02-06 172158522.png|center|thumb|483x483px]]&lt;br /&gt;
&lt;br /&gt;
==== Texture Size ====&lt;br /&gt;
As previously mentionned, Color, Normal and Metallic Maps are stored into square POT atlases. This field controls the resolution of these atlases, from 128x128 to 4096x4096. The &amp;lt;code&amp;gt;Estimated total size&amp;lt;/code&amp;gt; label provides the size of the whole impostor prefab after baking (with DXT compression) &lt;br /&gt;
&lt;br /&gt;
==== Sphere Type ====&lt;br /&gt;
&lt;br /&gt;
*'''UV sphere''': The default choice.  The UV sphere is based on a fixed number of longitude and latitude samples.  The coverage is denser at the poles.The UV Sphere is a solid choice in many use cases, with more versatility regarding partial sphere baking.&lt;br /&gt;
*'''Pseudo-Fibonacci sphere''': at an experimental stage.  Provides a homogeneous coverage. Not compatible with latitude interpolation in the impostor shader. Despite being homogeneous, the output impostor will look smooth near the equator, with more noticeable snaps or blur around the poles. Full sphere baking only.&lt;br /&gt;
&lt;br /&gt;
==== Longitude Samples ====&lt;br /&gt;
UV Sphere only. Holds the number of longitudinal samples. The higher the better for smooth horizontal rotation, at a cost of higher POV number thus lower resolution/POV in the atlas. All samples are equally spread around the 360 degrees.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Samples ====&lt;br /&gt;
UV Sphere only. Holds half of the number of latitudinal samples (equator excluded). This means that a 0 value will just bake around the equator. 1 will bake an additionnal sample on each side of the equator, and so on.&lt;br /&gt;
&lt;br /&gt;
The higher the better for smooth vertical rotation, at a cost of higher POV number thus lower resolution/POV in the atlas. &lt;br /&gt;
&lt;br /&gt;
==== Latitude Offset ====&lt;br /&gt;
UV Sphere only. Shifts the equator sample. Useful for partial spheres.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Step ====&lt;br /&gt;
UV Sphere only. Holds angular offset between two latitudinal samples. A small value will increase smoothness of vertical rotation, but may limit the global latitudinal range.  &lt;br /&gt;
&lt;br /&gt;
==== Density ====&lt;br /&gt;
Pseudo-Fibonacci sphere only. Controls the density of the sphere. The higher the better for smooth rotations in any direction, at a cost of higher POV number thus lower resolution/POV in the atlas.&lt;br /&gt;
&lt;br /&gt;
==== Lighting Method ====&lt;br /&gt;
&lt;br /&gt;
# '''Surface Estimation:''' Computes dedicated normal and metallic map atlases to get physically correct light reflections on the impostor. The recommended method. The baked impostor will use a lit surface shader.&lt;br /&gt;
# '''Use Scene Sun Source:''' Adds the sun source of the opened scene in the baking context. Can provide better results on single lit scenes, especially with intricate smoothness/occlusion materials. Uses significantly less memory per impostor. The baked impostor will use an unlit shader.&lt;br /&gt;
&lt;br /&gt;
==== Presets ====&lt;br /&gt;
You can add/load presets easily with the dedicated buttons. Gives an additional degree of freedom to match your workflow. A few relevant presets are already included such as 1-POV-billboard or different hemispheres. Importing a preset and modifying values won't modify the preset unless you explicitly export and replace it.&lt;br /&gt;
&lt;br /&gt;
=== Information ===&lt;br /&gt;
The whole information foldout is readonly. It provides useful visual feedback to help tweaking the previous category fields.&lt;br /&gt;
&lt;br /&gt;
[[File:Image 2024-02-06 180549368.png|center|thumb|426x426px]]&lt;br /&gt;
On the left column, some metrics are displayed. The values will appear in green is considered valid, orange when considered too low/high. Please note that these colors are purely informative and won't inhibit the impostor generation. &lt;br /&gt;
&lt;br /&gt;
* The total number of POV.  &lt;br /&gt;
** For UV Sphere Baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = S_{Long}*S_{Lat}&amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
** For Pseudo-Fibonacci Sphere baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = \sum_{l=-S_{Lat}/2}^{S_{Lat}/2}cos(\frac{2\pi.l}{S_{Lat}}).S_{Long} &amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The Atlas POV size. 15x15 means there are 15 POVs per line and per column.&lt;br /&gt;
* Single POV resolution&lt;br /&gt;
* The atlas coverage : if &amp;lt;math&amp;gt;\sqrt{N_{POV}}&amp;lt;/math&amp;gt; is an integer, the coverage will be 100% otherwise there will be blank slots in the atlas. 100% is better but not necessary.&lt;br /&gt;
* Unused memory : The estimated memory held by the blank slots in the grid. Will be 0 if the coverage is 100% &lt;br /&gt;
&lt;br /&gt;
On the right area stand 3 tabs for more visual information.&lt;br /&gt;
&lt;br /&gt;
* POVs : Visualize the Longitude / Latitude coverage. A great helper when tweaking the Quality Settings. You can orbit around with the mouse to see clearer.&lt;br /&gt;
* Layout : Visualize the Atlas  layout. Filled atlas slots will be green, blank will be red.&lt;br /&gt;
* Preview :  Visualize how pixelated your each single POV will be. Displays the actual objects entered in the Target foldout. You can orbit around with the mouse as well. &amp;lt;!-- Please note the snappiness/bluriness won't be previewed here. The area only shows your inputs layout in the impostor and the pixelization but does not stand for a contractual appearance of the ouput impostor. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LODGroup Settings ===&lt;br /&gt;
This category is not crucial since you can always modify it afterwards, but it can make you save a lot a time. If you just want to bake the impostor to a prefab without adding it to the scene, you can untick the field Automatic Setup.&lt;br /&gt;
[[File:Image 2024-02-06 183403606.png|center|thumb|394x394px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 4 possible scenarios for this area. &lt;br /&gt;
&lt;br /&gt;
* None of the input meshes are part of a LODGroup : A LODGroup will be added on the common ancestor. all the source renderers will be added in LOD0 and the impostor will be added in LOD1 following the given settings. A cross fading is added for smooth transitions.&lt;br /&gt;
* There is already a LODGroup but no impostors : The impostor will be added in an additional LOD level following the given parameters. Note that all the source renderers MUST belong to either no LOD or the same LOD level from the same LODGroup to avoid nested LODGroup errors.&lt;br /&gt;
* There is already a LODGroup with an impostor : The impostor will be replaced using the same relative height transition. Note that impostors are detected thanks to the ImpostorReference script attached to the LODGroup. If you want to have several impostors in the same LODGroup, just delete safely the ImpostorReference component before baking. Also, the previous impostor's prefab will not be deleted, only the instance in the scene will be replaced.&lt;br /&gt;
* There isn't any common ancestor for the input objects. Baking won't be possible.&lt;br /&gt;
&lt;br /&gt;
== Save Path ==&lt;br /&gt;
Impostors are saved as packed prefabs, embedding the quad mesh, the atlas(es) and the material. You can customize this path in this section.&lt;br /&gt;
[[File:Image 2024-02-06 184910768.png|center|thumb|401x401px]]&lt;br /&gt;
You can either type the path relative to the Assets folder or use the file browser with the dedicated button.&lt;br /&gt;
&lt;br /&gt;
The label underneath the text field hold the actual, unique path that will be used for the impostor. &lt;br /&gt;
&lt;br /&gt;
If the path contains one or more non-existing directories, they will be created automatically at baking time.&lt;br /&gt;
&lt;br /&gt;
Note that no file nor directory is created before baking. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Post-baking adjustments ==&lt;br /&gt;
Both the Lit and Unlit impostor materials have a custom Shader GUI where you can perform advanced post-baking adjustments.&lt;br /&gt;
[[File:Image 2024-02-06 190047781.png|center|thumb|865x865px]]&lt;br /&gt;
&lt;br /&gt;
=== Billboarding ===&lt;br /&gt;
The billboarding effect consists in making the quad face the camera at any time. This is performed in the vertex shader stage. &lt;br /&gt;
&lt;br /&gt;
* You can disable it with the dedicated toggle.&lt;br /&gt;
* Clamp Latitude will stop the vertical billboard effect if the view angle gets out of the latitudinal range. The horizontal billboarding will remain.&lt;br /&gt;
* Z Offset can get the a impostor closer from the camera. Really useful to get the most out of the LODGroup's crossfading effect, or to adapt the size at closer range without altering longer ranges.&lt;br /&gt;
&lt;br /&gt;
=== Surface ===&lt;br /&gt;
Due to the lack of smoothness, metallic and occlusion maps, it is sometimes required to tweak some surface parameters to match the source objects better.&lt;br /&gt;
* The Brightness slider can increase/decrease the albedo power.&lt;br /&gt;
* The Saturation slider can increase/decrease the color saturation.&lt;br /&gt;
* The Smoothness and Occlusion sliders work the same way than the default diffuse material. &lt;br /&gt;
* The Metallic slider is multiplied with the computed metallic map.&lt;br /&gt;
* The Curvature Occlusion slider applies an additionnal occlusion in rifts, and sharp angles, to estimate self-shades. Can create a gray outline on some objects.&lt;br /&gt;
&lt;br /&gt;
=== Contours ===&lt;br /&gt;
Impostors use opaque materials. To get the contours right we use alpha clipping to discard pixels that are not representing the object on each POV. The contours are usually fine out-of-the-box, but sometimes it is required to adjust a few settings.&lt;br /&gt;
* The Cutout slider can increase/decrease the sharpness of the alpha clipping geometry. You should not go higher than 0.5 to avoid cropping some important features.&lt;br /&gt;
&lt;br /&gt;
* The Interpolate toggle turns On/Off impostor bilinear interpolation smoothing. Interpolation removes the snapping effect, but adds blur. Note that interpolation adds shader complexity.&lt;br /&gt;
&lt;br /&gt;
* The Dithering Fade toggle turns On/Off Dithering fading on the edges of the impostor. Independant from the LODGroup crossfade effect.&lt;br /&gt;
[[File:2024-02-14-23-15-13.gif|center|From left to right: The original model, interpolation disabled, interpolation enabled.|frame]]&lt;br /&gt;
&lt;br /&gt;
=== Geometry ===&lt;br /&gt;
These settings are theoritically not needed but give additionnal freedom to advanced users.&lt;br /&gt;
* The Yaw/Elevation offset sliders make the object virtually rotate on the Horizontal/Vertical axis respectively. &lt;br /&gt;
&lt;br /&gt;
=== Advanced Options ===&lt;br /&gt;
You can control the Render Queue, Double sided Global Illumation and GPU instancing, like the default surface shader. &lt;br /&gt;
&lt;br /&gt;
== Compatible objects ==&lt;br /&gt;
Mirage Impostors are compatible with any object with a MeshFilter and a MeshRenderer attached. &lt;br /&gt;
&lt;br /&gt;
Note that translations (on all axes), scaling (on all axes) and rotation (around the vertical axis only) are supported. &lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
Due to their nature, Mirage's impostors have their few limitations.&lt;br /&gt;
&lt;br /&gt;
* Full rotation compatibility : as said just above, the impostors won't be rotated around X and Z axes even if their parent does. &lt;br /&gt;
* Lossy scale : Mirage uses the transforms [https://docs.unity3d.com/ScriptReference/Transform-lossyScale.html lossyScale] of the source objects. If the source objects are skewed by nested non uniform scaling a rotation, the impostor may be a appear close from but source but unskewed.&lt;br /&gt;
* Shadows : Mirage impostors are compatible with shadows but they are not physically correct since it only projects the alpha clipped quad instead of having a dedicated shadow pass. It means shadow will be correct if the light comes from the front or the back but not the sides of the impostor. This is a simplicity choice, since correct shadow would add a GPU-intensive shader pass and shadows are usually not even visible from the impostor nominal distance. Moreover, it keeps Mirage natively pipeline independant since shader graph is not yet designed to add custom passes.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Didn't find what you were searching for?&lt;br /&gt;
&lt;br /&gt;
Feel free to contact me by email or on my discord channel.&lt;br /&gt;
&lt;br /&gt;
[mailto:support@leochaumartin.com support@leochaumartin.com]&lt;br /&gt;
&lt;br /&gt;
https://discord.gg/kYwzdvAt8q&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://www.gamedeveloper.com/programming/dynamic-2d-imposters-a-simple-efficient-directx-9-implementation&lt;br /&gt;
&lt;br /&gt;
https://calcifer.org/kenneth-christiansen/ComputerScience/imposters.pdf&lt;br /&gt;
&lt;br /&gt;
https://developer.nvidia.com/gpugems/gpugems3/part-iv-image-effects/chapter-21-true-impostors&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=165</id>
		<title>Mirage</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=165"/>
		<updated>2024-02-14T22:34:57Z</updated>

		<summary type="html">&lt;p&gt;Lch: /* Contours */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Setup ==&lt;br /&gt;
The whole package is contained in the Mirage folder resulting from the import but you can move it wherever you want.&lt;br /&gt;
&lt;br /&gt;
== What is an impostor ==&lt;br /&gt;
An impostor or imposter is a dynamically rendered billboard texture map used to give an illusion of 3D geometry in the distance. &lt;br /&gt;
&lt;br /&gt;
In the Mirage context, you can have as many objects as you want in a single impostor, and all the the points of view are stored into an abedo, normal and metallic maps. Smoothness or occlusion are not baked into textures yet but are still customizable on post baking options.&lt;br /&gt;
== How to bake your first impostor ==&lt;br /&gt;
&amp;lt;code&amp;gt;Mirage&amp;lt;/code&amp;gt; consists in a single editor window. You can open it via &amp;lt;code&amp;gt;Window-&amp;gt;Mirage-&amp;gt;Impostors&amp;lt;/code&amp;gt;. For a simple one-click impostor approach, drag and drop the common ancestor of all the objects you want to bake into target area and click on the &amp;lt;code&amp;gt;Generate Impostor&amp;lt;/code&amp;gt; button. &lt;br /&gt;
&lt;br /&gt;
You can also customize a lot of settings for a more advanced usage. There are 5 category foldouts that can expanded or hidden by clicking on their title. Even when hidden, they still provide basic information or controls on the right of the title. &lt;br /&gt;
&lt;br /&gt;
The following sections will provide detailed explaination of each category.[[File:Image 2024-02-06 164734156.png|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
=== Setup the target(s) ===&lt;br /&gt;
This category holds all the source object(s) information. Note that only one impostor can be baked at a time, so all the target will all be part of the same impostor. &lt;br /&gt;
For a simple approach, drag and drop the common ancestor in the dedicated field. Note that if you want to bake only one object the common ancestor can be the object itself or its parent. When the common ancestor is set, Mirage will automatically detect all the mesh filters in its children, recursively. You can check which mesh filters are included by expanding the section as following. Null or invalid objects will be ignored. &lt;br /&gt;
[[File:Image 2024-02-06 170842562.png|center|thumb|357x357px]]&lt;br /&gt;
You can also exclude some meshes or add some manually by dropping them into the area. If you change the mesh filters manually, the common ancestor will be updated accordingly. Note that '''a common ancestor is needed to bake an impostor'''. &lt;br /&gt;
&lt;br /&gt;
=== Quality Settings ===&lt;br /&gt;
This category is crucial and will have a direct impact on the visual quality of the impostor as it provides full control over the baking topology. This section should be paired with the &amp;lt;code&amp;gt;Information&amp;lt;/code&amp;gt; category that provides real-time visualization for an excellent and fast control over the baking topology.&lt;br /&gt;
[[File:Image 2024-02-06 172158522.png|center|thumb|483x483px]]&lt;br /&gt;
&lt;br /&gt;
==== Texture Size ====&lt;br /&gt;
As previously mentionned, Color, Normal and Metallic Maps are stored into square POT atlases. This field controls the resolution of these atlases, from 128x128 to 4096x4096. The &amp;lt;code&amp;gt;Estimated total size&amp;lt;/code&amp;gt; label provides the size of the whole impostor prefab after baking (with DXT compression) &lt;br /&gt;
&lt;br /&gt;
==== Sphere Type ====&lt;br /&gt;
&lt;br /&gt;
*'''UV sphere''': The default choice.  The UV sphere is based on a fixed number of longitude and latitude samples.  The coverage is denser at the poles.The UV Sphere is a solid choice in many use cases, with more versatility regarding partial sphere baking.&lt;br /&gt;
*'''Pseudo-Fibonacci sphere''': at an experimental stage.  Provides a homogeneous coverage. Not compatible with latitude interpolation in the impostor shader. Despite being homogeneous, the output impostor will look smooth near the equator, with more noticeable snaps or blur around the poles. Full sphere baking only.&lt;br /&gt;
&lt;br /&gt;
==== Longitude Samples ====&lt;br /&gt;
UV Sphere only. Holds the number of longitudinal samples. The higher the better for smooth horizontal rotation, at a cost of higher POV number thus lower resolution/POV in the atlas. All samples are equally spread around the 360 degrees.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Samples ====&lt;br /&gt;
UV Sphere only. Holds half of the number of latitudinal samples (equator excluded). This means that a 0 value will just bake around the equator. 1 will bake an additionnal sample on each side of the equator, and so on.&lt;br /&gt;
&lt;br /&gt;
The higher the better for smooth vertical rotation, at a cost of higher POV number thus lower resolution/POV in the atlas. &lt;br /&gt;
&lt;br /&gt;
==== Latitude Offset ====&lt;br /&gt;
UV Sphere only. Shifts the equator sample. Useful for partial spheres.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Step ====&lt;br /&gt;
UV Sphere only. Holds angular offset between two latitudinal samples. A small value will increase smoothness of vertical rotation, but may limit the global latitudinal range.  &lt;br /&gt;
&lt;br /&gt;
==== Density ====&lt;br /&gt;
Pseudo-Fibonacci sphere only. Controls the density of the sphere. The higher the better for smooth rotations in any direction, at a cost of higher POV number thus lower resolution/POV in the atlas.&lt;br /&gt;
&lt;br /&gt;
==== Lighting Method ====&lt;br /&gt;
&lt;br /&gt;
# '''Surface Estimation:''' Computes dedicated normal and metallic map atlases to get physically correct light reflections on the impostor. The recommended method. The baked impostor will use a lit surface shader.&lt;br /&gt;
# '''Use Scene Sun Source:''' Adds the sun source of the opened scene in the baking context. Can provide better results on single lit scenes, especially with intricate smoothness/occlusion materials. Uses significantly less memory per impostor. The baked impostor will use an unlit shader.&lt;br /&gt;
&lt;br /&gt;
==== Presets ====&lt;br /&gt;
You can add/load presets easily with the dedicated buttons. Gives an additional degree of freedom to match your workflow. A few relevant presets are already included such as 1-POV-billboard or different hemispheres. Importing a preset and modifying values won't modify the preset unless you explicitly export and replace it.&lt;br /&gt;
&lt;br /&gt;
=== Information ===&lt;br /&gt;
The whole information foldout is readonly. It provides useful visual feedback to help tweaking the previous category fields.&lt;br /&gt;
&lt;br /&gt;
[[File:Image 2024-02-06 180549368.png|center|thumb|426x426px]]&lt;br /&gt;
On the left column, some metrics are displayed. The values will appear in green is considered valid, orange when considered too low/high. Please note that these colors are purely informative and won't inhibit the impostor generation. &lt;br /&gt;
&lt;br /&gt;
* The total number of POV.  &lt;br /&gt;
** For UV Sphere Baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = S_{Long}*S_{Lat}&amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
** For Pseudo-Fibonacci Sphere baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = \sum_{l=-S_{Lat}/2}^{S_{Lat}/2}cos(\frac{2\pi.l}{S_{Lat}}).S_{Long} &amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The Atlas POV size. 15x15 means there are 15 POVs per line and per column.&lt;br /&gt;
* Single POV resolution&lt;br /&gt;
* The atlas coverage : if &amp;lt;math&amp;gt;\sqrt{N_{POV}}&amp;lt;/math&amp;gt; is an integer, the coverage will be 100% otherwise there will be blank slots in the atlas. 100% is better but not necessary.&lt;br /&gt;
* Unused memory : The estimated memory held by the blank slots in the grid. Will be 0 if the coverage is 100% &lt;br /&gt;
&lt;br /&gt;
On the right area stand 3 tabs for more visual information.&lt;br /&gt;
&lt;br /&gt;
* POVs : Visualize the Longitude / Latitude coverage. A great helper when tweaking the Quality Settings. You can orbit around with the mouse to see clearer.&lt;br /&gt;
* Layout : Visualize the Atlas  layout. Filled atlas slots will be green, blank will be red.&lt;br /&gt;
* Preview :  Visualize how pixelated your each single POV will be. Displays the actual objects entered in the Target foldout. You can orbit around with the mouse as well. &amp;lt;!-- Please note the snappiness/bluriness won't be previewed here. The area only shows your inputs layout in the impostor and the pixelization but does not stand for a contractual appearance of the ouput impostor. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LODGroup Settings ===&lt;br /&gt;
This category is not crucial since you can always modify it afterwards, but it can make you save a lot a time. If you just want to bake the impostor to a prefab without adding it to the scene, you can untick the field Automatic Setup.&lt;br /&gt;
[[File:Image 2024-02-06 183403606.png|center|thumb|394x394px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 4 possible scenarios for this area. &lt;br /&gt;
&lt;br /&gt;
* None of the input meshes are part of a LODGroup : A LODGroup will be added on the common ancestor. all the source renderers will be added in LOD0 and the impostor will be added in LOD1 following the given settings. A cross fading is added for smooth transitions.&lt;br /&gt;
* There is already a LODGroup but no impostors : The impostor will be added in an additional LOD level following the given parameters. Note that all the source renderers MUST belong to either no LOD or the same LOD level from the same LODGroup to avoid nested LODGroup errors.&lt;br /&gt;
* There is already a LODGroup with an impostor : The impostor will be replaced using the same relative height transition. Note that impostors are detected thanks to the ImpostorReference script attached to the LODGroup. If you want to have several impostors in the same LODGroup, just delete safely the ImpostorReference component before baking. Also, the previous impostor's prefab will not be deleted, only the instance in the scene will be replaced.&lt;br /&gt;
* There isn't any common ancestor for the input objects. Baking won't be possible.&lt;br /&gt;
&lt;br /&gt;
== Save Path ==&lt;br /&gt;
Impostors are saved as packed prefabs, embedding the quad mesh, the atlas(es) and the material. You can customize this path in this section.&lt;br /&gt;
[[File:Image 2024-02-06 184910768.png|center|thumb|401x401px]]&lt;br /&gt;
You can either type the path relative to the Assets folder or use the file browser with the dedicated button.&lt;br /&gt;
&lt;br /&gt;
The label underneath the text field hold the actual, unique path that will be used for the impostor. &lt;br /&gt;
&lt;br /&gt;
If the path contains one or more non-existing directories, they will be created automatically at baking time.&lt;br /&gt;
&lt;br /&gt;
Note that no file nor directory is created before baking. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Post-baking adjustments ==&lt;br /&gt;
Both the Lit and Unlit impostor materials have a custom Shader GUI where you can perform advanced post-baking adjustments.&lt;br /&gt;
[[File:Image 2024-02-06 190047781.png|center|thumb|865x865px]]&lt;br /&gt;
&lt;br /&gt;
=== Billboarding ===&lt;br /&gt;
The billboarding effect consists in making the quad face the camera at any time. This is performed in the vertex shader stage. &lt;br /&gt;
&lt;br /&gt;
* You can disable it with the dedicated toggle.&lt;br /&gt;
* Clamp Latitude will stop the vertical billboard effect if the view angle gets out of the latitudinal range. The horizontal billboarding will remain.&lt;br /&gt;
* Z Offset can get the a impostor closer from the camera. Really useful to get the most out of the LODGroup's crossfading effect, or to adapt the size at closer range without altering longer ranges.&lt;br /&gt;
&lt;br /&gt;
=== Surface ===&lt;br /&gt;
Due to the lack of smoothness, metallic and occlusion maps, it is sometimes required to tweak some surface parameters to match the source objects better.&lt;br /&gt;
* The Brightness slider can increase/decrease the albedo power.&lt;br /&gt;
* The Saturation slider can increase/decrease the color saturation.&lt;br /&gt;
* The Smoothness and Occlusion sliders work the same way than the default diffuse material. &lt;br /&gt;
* The Metallic slider is multiplied with the computed metallic map.&lt;br /&gt;
* The Curvature Occlusion slider applies an additionnal occlusion in rifts, and sharp angles, to estimate self-shades. Can create a gray outline on some objects.&lt;br /&gt;
&lt;br /&gt;
=== Contours ===&lt;br /&gt;
Impostors use opaque materials. To get the contours right we use alpha clipping to discard pixels that are not representing the object on each POV. The contours are usually fine out-of-the-box, but sometimes it is required to adjust a few settings.&lt;br /&gt;
* The Cutout slider can increase/decrease the sharpness of the alpha clipping geometry. You should not go higher than 0.5 to avoid cropping some important features.&lt;br /&gt;
&lt;br /&gt;
* The Interpolate toggle turns On/Off impostor bilinear interpolation smoothing. Interpolation removes the snapping effect, but adds blur. Note that interpolation adds shader complexity.&lt;br /&gt;
&lt;br /&gt;
* The Dithering Fade toggle turns On/Off Dithering fading on the edges of the impostor. Independant from the LODGroup crossfade effect.&lt;br /&gt;
[[File:2024-02-14-23-15-13.gif|center|From left to right: The original model, interpolation disabled, interpolation enabled.|frame]]&lt;br /&gt;
&lt;br /&gt;
=== Geometry ===&lt;br /&gt;
These settings are theoritically not needed but give additionnal freedom to advanced users.&lt;br /&gt;
* The Yaw/Elevation offset sliders make the object virtually rotate on the Horizontal/Vertical axis respectively. &lt;br /&gt;
&lt;br /&gt;
=== Advanced Options ===&lt;br /&gt;
You can control the Render Queue, Double sided Global Illumation and GPU instancing, like the default surface shader. &lt;br /&gt;
&lt;br /&gt;
== Compatible objects ==&lt;br /&gt;
Mirage Impostors are compatible with any object with a MeshFilter and a MeshRenderer attached. &lt;br /&gt;
&lt;br /&gt;
Note that translations (on all axes), scaling (on all axes) and rotation (around the vertical axis only) are supported. &lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
Due to their nature, Mirage impostors have their few limitations.&lt;br /&gt;
&lt;br /&gt;
* Full rotation compatibility : as said just above, the impostors won't be rotated around X and Z axes even if their parent does. &lt;br /&gt;
* Lossy scale : Mirage uses the transforms [https://docs.unity3d.com/ScriptReference/Transform-lossyScale.html lossyScale] of the source objects. If the source objects are skewed by nested non uniform scaling a rotation, the impostor may be a appear close from but source but unskewed.&lt;br /&gt;
* Shadows : Mirage impostors are compatible with shadows but they are not physically correct since it only projects the alpha clipped quad instead of having a dedicated shadow pass. It means shadow will be correct if the light comes from the front or the back but not the sides of the impostor. This is a simplicity choice, since correct shadow would add a GPU-intensive shader pass and shadows are usually not even visible from the impostor nominal distance. Moreover, it keeps Mirage natively pipeline independant since shader graph is not designed to add custom passes.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Didn't find what you were searching for?&lt;br /&gt;
&lt;br /&gt;
Feel free to contact me by email or on my discord channel.&lt;br /&gt;
&lt;br /&gt;
[mailto:support@leochaumartin.com support@leochaumartin.com]&lt;br /&gt;
&lt;br /&gt;
https://discord.gg/kYwzdvAt8q&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://www.gamedeveloper.com/programming/dynamic-2d-imposters-a-simple-efficient-directx-9-implementation&lt;br /&gt;
&lt;br /&gt;
https://calcifer.org/kenneth-christiansen/ComputerScience/imposters.pdf&lt;br /&gt;
&lt;br /&gt;
https://developer.nvidia.com/gpugems/gpugems3/part-iv-image-effects/chapter-21-true-impostors&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=164</id>
		<title>Mirage</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=164"/>
		<updated>2024-02-14T22:34:07Z</updated>

		<summary type="html">&lt;p&gt;Lch: /* Presets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Setup ==&lt;br /&gt;
The whole package is contained in the Mirage folder resulting from the import but you can move it wherever you want.&lt;br /&gt;
&lt;br /&gt;
== What is an impostor ==&lt;br /&gt;
An impostor or imposter is a dynamically rendered billboard texture map used to give an illusion of 3D geometry in the distance. &lt;br /&gt;
&lt;br /&gt;
In the Mirage context, you can have as many objects as you want in a single impostor, and all the the points of view are stored into an abedo, normal and metallic maps. Smoothness or occlusion are not baked into textures yet but are still customizable on post baking options.&lt;br /&gt;
== How to bake your first impostor ==&lt;br /&gt;
&amp;lt;code&amp;gt;Mirage&amp;lt;/code&amp;gt; consists in a single editor window. You can open it via &amp;lt;code&amp;gt;Window-&amp;gt;Mirage-&amp;gt;Impostors&amp;lt;/code&amp;gt;. For a simple one-click impostor approach, drag and drop the common ancestor of all the objects you want to bake into target area and click on the &amp;lt;code&amp;gt;Generate Impostor&amp;lt;/code&amp;gt; button. &lt;br /&gt;
&lt;br /&gt;
You can also customize a lot of settings for a more advanced usage. There are 5 category foldouts that can expanded or hidden by clicking on their title. Even when hidden, they still provide basic information or controls on the right of the title. &lt;br /&gt;
&lt;br /&gt;
The following sections will provide detailed explaination of each category.[[File:Image 2024-02-06 164734156.png|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
=== Setup the target(s) ===&lt;br /&gt;
This category holds all the source object(s) information. Note that only one impostor can be baked at a time, so all the target will all be part of the same impostor. &lt;br /&gt;
For a simple approach, drag and drop the common ancestor in the dedicated field. Note that if you want to bake only one object the common ancestor can be the object itself or its parent. When the common ancestor is set, Mirage will automatically detect all the mesh filters in its children, recursively. You can check which mesh filters are included by expanding the section as following. Null or invalid objects will be ignored. &lt;br /&gt;
[[File:Image 2024-02-06 170842562.png|center|thumb|357x357px]]&lt;br /&gt;
You can also exclude some meshes or add some manually by dropping them into the area. If you change the mesh filters manually, the common ancestor will be updated accordingly. Note that '''a common ancestor is needed to bake an impostor'''. &lt;br /&gt;
&lt;br /&gt;
=== Quality Settings ===&lt;br /&gt;
This category is crucial and will have a direct impact on the visual quality of the impostor as it provides full control over the baking topology. This section should be paired with the &amp;lt;code&amp;gt;Information&amp;lt;/code&amp;gt; category that provides real-time visualization for an excellent and fast control over the baking topology.&lt;br /&gt;
[[File:Image 2024-02-06 172158522.png|center|thumb|483x483px]]&lt;br /&gt;
&lt;br /&gt;
==== Texture Size ====&lt;br /&gt;
As previously mentionned, Color, Normal and Metallic Maps are stored into square POT atlases. This field controls the resolution of these atlases, from 128x128 to 4096x4096. The &amp;lt;code&amp;gt;Estimated total size&amp;lt;/code&amp;gt; label provides the size of the whole impostor prefab after baking (with DXT compression) &lt;br /&gt;
&lt;br /&gt;
==== Sphere Type ====&lt;br /&gt;
&lt;br /&gt;
*'''UV sphere''': The default choice.  The UV sphere is based on a fixed number of longitude and latitude samples.  The coverage is denser at the poles.The UV Sphere is a solid choice in many use cases, with more versatility regarding partial sphere baking.&lt;br /&gt;
*'''Pseudo-Fibonacci sphere''': at an experimental stage.  Provides a homogeneous coverage. Not compatible with latitude interpolation in the impostor shader. Despite being homogeneous, the output impostor will look smooth near the equator, with more noticeable snaps or blur around the poles. Full sphere baking only.&lt;br /&gt;
&lt;br /&gt;
==== Longitude Samples ====&lt;br /&gt;
UV Sphere only. Holds the number of longitudinal samples. The higher the better for smooth horizontal rotation, at a cost of higher POV number thus lower resolution/POV in the atlas. All samples are equally spread around the 360 degrees.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Samples ====&lt;br /&gt;
UV Sphere only. Holds half of the number of latitudinal samples (equator excluded). This means that a 0 value will just bake around the equator. 1 will bake an additionnal sample on each side of the equator, and so on.&lt;br /&gt;
&lt;br /&gt;
The higher the better for smooth vertical rotation, at a cost of higher POV number thus lower resolution/POV in the atlas. &lt;br /&gt;
&lt;br /&gt;
==== Latitude Offset ====&lt;br /&gt;
UV Sphere only. Shifts the equator sample. Useful for partial spheres.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Step ====&lt;br /&gt;
UV Sphere only. Holds angular offset between two latitudinal samples. A small value will increase smoothness of vertical rotation, but may limit the global latitudinal range.  &lt;br /&gt;
&lt;br /&gt;
==== Density ====&lt;br /&gt;
Pseudo-Fibonacci sphere only. Controls the density of the sphere. The higher the better for smooth rotations in any direction, at a cost of higher POV number thus lower resolution/POV in the atlas.&lt;br /&gt;
&lt;br /&gt;
==== Lighting Method ====&lt;br /&gt;
&lt;br /&gt;
# '''Surface Estimation:''' Computes dedicated normal and metallic map atlases to get physically correct light reflections on the impostor. The recommended method. The baked impostor will use a lit surface shader.&lt;br /&gt;
# '''Use Scene Sun Source:''' Adds the sun source of the opened scene in the baking context. Can provide better results on single lit scenes, especially with intricate smoothness/occlusion materials. Uses significantly less memory per impostor. The baked impostor will use an unlit shader.&lt;br /&gt;
&lt;br /&gt;
==== Presets ====&lt;br /&gt;
You can add/load presets easily with the dedicated buttons. Gives an additional degree of freedom to match your workflow. A few relevant presets are already included such as 1-POV-billboard or different hemispheres. Importing a preset and modifying values won't modify the preset unless you explicitly export and replace it.&lt;br /&gt;
&lt;br /&gt;
=== Information ===&lt;br /&gt;
The whole information foldout is readonly. It provides useful visual feedback to help tweaking the previous category fields.&lt;br /&gt;
&lt;br /&gt;
[[File:Image 2024-02-06 180549368.png|center|thumb|426x426px]]&lt;br /&gt;
On the left column, some metrics are displayed. The values will appear in green is considered valid, orange when considered too low/high. Please note that these colors are purely informative and won't inhibit the impostor generation. &lt;br /&gt;
&lt;br /&gt;
* The total number of POV.  &lt;br /&gt;
** For UV Sphere Baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = S_{Long}*S_{Lat}&amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
** For Pseudo-Fibonacci Sphere baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = \sum_{l=-S_{Lat}/2}^{S_{Lat}/2}cos(\frac{2\pi.l}{S_{Lat}}).S_{Long} &amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The Atlas POV size. 15x15 means there are 15 POVs per line and per column.&lt;br /&gt;
* Single POV resolution&lt;br /&gt;
* The atlas coverage : if &amp;lt;math&amp;gt;\sqrt{N_{POV}}&amp;lt;/math&amp;gt; is an integer, the coverage will be 100% otherwise there will be blank slots in the atlas. 100% is better but not necessary.&lt;br /&gt;
* Unused memory : The estimated memory held by the blank slots in the grid. Will be 0 if the coverage is 100% &lt;br /&gt;
&lt;br /&gt;
On the right area stand 3 tabs for more visual information.&lt;br /&gt;
&lt;br /&gt;
* POVs : Visualize the Longitude / Latitude coverage. A great helper when tweaking the Quality Settings. You can orbit around with the mouse to see clearer.&lt;br /&gt;
* Layout : Visualize the Atlas  layout. Filled atlas slots will be green, blank will be red.&lt;br /&gt;
* Preview :  Visualize how pixelated your each single POV will be. Displays the actual objects entered in the Target foldout. You can orbit around with the mouse as well. &amp;lt;!-- Please note the snappiness/bluriness won't be previewed here. The area only shows your inputs layout in the impostor and the pixelization but does not stand for a contractual appearance of the ouput impostor. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LODGroup Settings ===&lt;br /&gt;
This category is not crucial since you can always modify it afterwards, but it can make you save a lot a time. If you just want to bake the impostor to a prefab without adding it to the scene, you can untick the field Automatic Setup.&lt;br /&gt;
[[File:Image 2024-02-06 183403606.png|center|thumb|394x394px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 4 possible scenarios for this area. &lt;br /&gt;
&lt;br /&gt;
* None of the input meshes are part of a LODGroup : A LODGroup will be added on the common ancestor. all the source renderers will be added in LOD0 and the impostor will be added in LOD1 following the given settings. A cross fading is added for smooth transitions.&lt;br /&gt;
* There is already a LODGroup but no impostors : The impostor will be added in an additional LOD level following the given parameters. Note that all the source renderers MUST belong to either no LOD or the same LOD level from the same LODGroup to avoid nested LODGroup errors.&lt;br /&gt;
* There is already a LODGroup with an impostor : The impostor will be replaced using the same relative height transition. Note that impostors are detected thanks to the ImpostorReference script attached to the LODGroup. If you want to have several impostors in the same LODGroup, just delete safely the ImpostorReference component before baking. Also, the previous impostor's prefab will not be deleted, only the instance in the scene will be replaced.&lt;br /&gt;
* There isn't any common ancestor for the input objects. Baking won't be possible.&lt;br /&gt;
&lt;br /&gt;
== Save Path ==&lt;br /&gt;
Impostors are saved as packed prefabs, embedding the quad mesh, the atlas(es) and the material. You can customize this path in this section.&lt;br /&gt;
[[File:Image 2024-02-06 184910768.png|center|thumb|401x401px]]&lt;br /&gt;
You can either type the path relative to the Assets folder or use the file browser with the dedicated button.&lt;br /&gt;
&lt;br /&gt;
The label underneath the text field hold the actual, unique path that will be used for the impostor. &lt;br /&gt;
&lt;br /&gt;
If the path contains one or more non-existing directories, they will be created automatically at baking time.&lt;br /&gt;
&lt;br /&gt;
Note that no file nor directory is created before baking. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Post-baking adjustments ==&lt;br /&gt;
Both the Lit and Unlit impostor materials have a custom Shader GUI where you can perform advanced post-baking adjustments.&lt;br /&gt;
[[File:Image 2024-02-06 190047781.png|center|thumb|865x865px]]&lt;br /&gt;
&lt;br /&gt;
=== Billboarding ===&lt;br /&gt;
The billboarding effect consists in making the quad face the camera at any time. This is performed in the vertex shader stage. &lt;br /&gt;
&lt;br /&gt;
* You can disable it with the dedicated toggle.&lt;br /&gt;
* Clamp Latitude will stop the vertical billboard effect if the view angle gets out of the latitudinal range. The horizontal billboarding will remain.&lt;br /&gt;
* Z Offset can get the a impostor closer from the camera. Really useful to get the most out of the LODGroup's crossfading effect, or to adapt the size at closer range without altering longer ranges.&lt;br /&gt;
&lt;br /&gt;
=== Surface ===&lt;br /&gt;
Due to the lack of smoothness, metallic and occlusion maps, it is sometimes required to tweak some surface parameters to match the source objects better.&lt;br /&gt;
* The Brightness slider can increase/decrease the albedo power.&lt;br /&gt;
* The Saturation slider can increase/decrease the color saturation.&lt;br /&gt;
* The Smoothness and Occlusion sliders work the same way than the default diffuse material. &lt;br /&gt;
* The Metallic slider is multiplied with the computed metallic map.&lt;br /&gt;
* The Curvature Occlusion slider applies an additionnal occlusion in rifts, and sharp angles, to estimate self-shades. Can create a gray outline on some objects.&lt;br /&gt;
&lt;br /&gt;
=== Contours ===&lt;br /&gt;
Impostors use opaque materials. To get the contours right we use alpha clipping to discard pixels that are not representing the object on each POV. The contours are usually fine out-of-the-box, but sometimes it is required to adjust a few settings.&lt;br /&gt;
* The Cutout slider can increase/decrease the sharpness of the alpha clipping geometry. You should not go higher than 0.5 to avoid cropping some important features.&lt;br /&gt;
&lt;br /&gt;
* The Interpolate toggle turns On/Off impostor bilinear interpolation smoothing. Interpolation removes the snapping effect, but adds blur. Note that interpolation adds shader complexity.&lt;br /&gt;
&lt;br /&gt;
* The Dithering Fade toggle turns On/Off Dithering fading on the edges of the impostor. Independant from the LODGroup crossfade effect.&lt;br /&gt;
[[File:2024-02-14-23-15-13.gif|center|From left to right: The original model, interpolation disabled, interpolation enabled.]]&lt;br /&gt;
&lt;br /&gt;
=== Geometry ===&lt;br /&gt;
These settings are theoritically not needed but give additionnal freedom to advanced users.&lt;br /&gt;
* The Yaw/Elevation offset sliders make the object virtually rotate on the Horizontal/Vertical axis respectively. &lt;br /&gt;
&lt;br /&gt;
=== Advanced Options ===&lt;br /&gt;
You can control the Render Queue, Double sided Global Illumation and GPU instancing, like the default surface shader. &lt;br /&gt;
&lt;br /&gt;
== Compatible objects ==&lt;br /&gt;
Mirage Impostors are compatible with any object with a MeshFilter and a MeshRenderer attached. &lt;br /&gt;
&lt;br /&gt;
Note that translations (on all axes), scaling (on all axes) and rotation (around the vertical axis only) are supported. &lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
Due to their nature, Mirage impostors have their few limitations.&lt;br /&gt;
&lt;br /&gt;
* Full rotation compatibility : as said just above, the impostors won't be rotated around X and Z axes even if their parent does. &lt;br /&gt;
* Lossy scale : Mirage uses the transforms [https://docs.unity3d.com/ScriptReference/Transform-lossyScale.html lossyScale] of the source objects. If the source objects are skewed by nested non uniform scaling a rotation, the impostor may be a appear close from but source but unskewed.&lt;br /&gt;
* Shadows : Mirage impostors are compatible with shadows but they are not physically correct since it only projects the alpha clipped quad instead of having a dedicated shadow pass. It means shadow will be correct if the light comes from the front or the back but not the sides of the impostor. This is a simplicity choice, since correct shadow would add a GPU-intensive shader pass and shadows are usually not even visible from the impostor nominal distance. Moreover, it keeps Mirage natively pipeline independant since shader graph is not designed to add custom passes.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Didn't find what you were searching for?&lt;br /&gt;
&lt;br /&gt;
Feel free to contact me by email or on my discord channel.&lt;br /&gt;
&lt;br /&gt;
[mailto:support@leochaumartin.com support@leochaumartin.com]&lt;br /&gt;
&lt;br /&gt;
https://discord.gg/kYwzdvAt8q&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://www.gamedeveloper.com/programming/dynamic-2d-imposters-a-simple-efficient-directx-9-implementation&lt;br /&gt;
&lt;br /&gt;
https://calcifer.org/kenneth-christiansen/ComputerScience/imposters.pdf&lt;br /&gt;
&lt;br /&gt;
https://developer.nvidia.com/gpugems/gpugems3/part-iv-image-effects/chapter-21-true-impostors&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=163</id>
		<title>Mirage</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=163"/>
		<updated>2024-02-14T22:30:31Z</updated>

		<summary type="html">&lt;p&gt;Lch: /* What is an impostor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Setup ==&lt;br /&gt;
The whole package is contained in the Mirage folder resulting from the import but you can move it wherever you want.&lt;br /&gt;
&lt;br /&gt;
== What is an impostor ==&lt;br /&gt;
An impostor or imposter is a dynamically rendered billboard texture map used to give an illusion of 3D geometry in the distance. &lt;br /&gt;
&lt;br /&gt;
In the Mirage context, you can have as many objects as you want in a single impostor, and all the the points of view are stored into an abedo, normal and metallic maps. Smoothness or occlusion are not baked into textures yet but are still customizable on post baking options.&lt;br /&gt;
== How to bake your first impostor ==&lt;br /&gt;
&amp;lt;code&amp;gt;Mirage&amp;lt;/code&amp;gt; consists in a single editor window. You can open it via &amp;lt;code&amp;gt;Window-&amp;gt;Mirage-&amp;gt;Impostors&amp;lt;/code&amp;gt;. For a simple one-click impostor approach, drag and drop the common ancestor of all the objects you want to bake into target area and click on the &amp;lt;code&amp;gt;Generate Impostor&amp;lt;/code&amp;gt; button. &lt;br /&gt;
&lt;br /&gt;
You can also customize a lot of settings for a more advanced usage. There are 5 category foldouts that can expanded or hidden by clicking on their title. Even when hidden, they still provide basic information or controls on the right of the title. &lt;br /&gt;
&lt;br /&gt;
The following sections will provide detailed explaination of each category.[[File:Image 2024-02-06 164734156.png|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
=== Setup the target(s) ===&lt;br /&gt;
This category holds all the source object(s) information. Note that only one impostor can be baked at a time, so all the target will all be part of the same impostor. &lt;br /&gt;
For a simple approach, drag and drop the common ancestor in the dedicated field. Note that if you want to bake only one object the common ancestor can be the object itself or its parent. When the common ancestor is set, Mirage will automatically detect all the mesh filters in its children, recursively. You can check which mesh filters are included by expanding the section as following. Null or invalid objects will be ignored. &lt;br /&gt;
[[File:Image 2024-02-06 170842562.png|center|thumb|357x357px]]&lt;br /&gt;
You can also exclude some meshes or add some manually by dropping them into the area. If you change the mesh filters manually, the common ancestor will be updated accordingly. Note that '''a common ancestor is needed to bake an impostor'''. &lt;br /&gt;
&lt;br /&gt;
=== Quality Settings ===&lt;br /&gt;
This category is crucial and will have a direct impact on the visual quality of the impostor as it provides full control over the baking topology. This section should be paired with the &amp;lt;code&amp;gt;Information&amp;lt;/code&amp;gt; category that provides real-time visualization for an excellent and fast control over the baking topology.&lt;br /&gt;
[[File:Image 2024-02-06 172158522.png|center|thumb|483x483px]]&lt;br /&gt;
&lt;br /&gt;
==== Texture Size ====&lt;br /&gt;
As previously mentionned, Color, Normal and Metallic Maps are stored into square POT atlases. This field controls the resolution of these atlases, from 128x128 to 4096x4096. The &amp;lt;code&amp;gt;Estimated total size&amp;lt;/code&amp;gt; label provides the size of the whole impostor prefab after baking (with DXT compression) &lt;br /&gt;
&lt;br /&gt;
==== Sphere Type ====&lt;br /&gt;
&lt;br /&gt;
*'''UV sphere''': The default choice.  The UV sphere is based on a fixed number of longitude and latitude samples.  The coverage is denser at the poles.The UV Sphere is a solid choice in many use cases, with more versatility regarding partial sphere baking.&lt;br /&gt;
*'''Pseudo-Fibonacci sphere''': at an experimental stage.  Provides a homogeneous coverage. Not compatible with latitude interpolation in the impostor shader. Despite being homogeneous, the output impostor will look smooth near the equator, with more noticeable snaps or blur around the poles. Full sphere baking only.&lt;br /&gt;
&lt;br /&gt;
==== Longitude Samples ====&lt;br /&gt;
UV Sphere only. Holds the number of longitudinal samples. The higher the better for smooth horizontal rotation, at a cost of higher POV number thus lower resolution/POV in the atlas. All samples are equally spread around the 360 degrees.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Samples ====&lt;br /&gt;
UV Sphere only. Holds half of the number of latitudinal samples (equator excluded). This means that a 0 value will just bake around the equator. 1 will bake an additionnal sample on each side of the equator, and so on.&lt;br /&gt;
&lt;br /&gt;
The higher the better for smooth vertical rotation, at a cost of higher POV number thus lower resolution/POV in the atlas. &lt;br /&gt;
&lt;br /&gt;
==== Latitude Offset ====&lt;br /&gt;
UV Sphere only. Shifts the equator sample. Useful for partial spheres.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Step ====&lt;br /&gt;
UV Sphere only. Holds angular offset between two latitudinal samples. A small value will increase smoothness of vertical rotation, but may limit the global latitudinal range.  &lt;br /&gt;
&lt;br /&gt;
==== Density ====&lt;br /&gt;
Pseudo-Fibonacci sphere only. Controls the density of the sphere. The higher the better for smooth rotations in any direction, at a cost of higher POV number thus lower resolution/POV in the atlas.&lt;br /&gt;
&lt;br /&gt;
==== Lighting Method ====&lt;br /&gt;
&lt;br /&gt;
# '''Surface Estimation:''' Computes dedicated normal and metallic map atlases to get physically correct light reflections on the impostor. The recommended method. The baked impostor will use a lit surface shader.&lt;br /&gt;
# '''Use Scene Sun Source:''' Adds the sun source of the opened scene in the baking context. Can provide better results on single lit scenes, especially with intricate smoothness/occlusion materials. The baked impostor will use an unlit shader.&lt;br /&gt;
&lt;br /&gt;
==== Presets ====&lt;br /&gt;
You can add/load presets easily with the dedicated buttons. Gives an additional degree of freedom to match your workflow. A few relevant presets are already included such as 1-POV-billboard or different hemispheres.&lt;br /&gt;
&lt;br /&gt;
=== Information ===&lt;br /&gt;
The whole information foldout is readonly. It provides useful visual feedback to help tweaking the previous category fields.&lt;br /&gt;
&lt;br /&gt;
[[File:Image 2024-02-06 180549368.png|center|thumb|426x426px]]&lt;br /&gt;
On the left column, some metrics are displayed. The values will appear in green is considered valid, orange when considered too low/high. Please note that these colors are purely informative and won't inhibit the impostor generation. &lt;br /&gt;
&lt;br /&gt;
* The total number of POV.  &lt;br /&gt;
** For UV Sphere Baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = S_{Long}*S_{Lat}&amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
** For Pseudo-Fibonacci Sphere baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = \sum_{l=-S_{Lat}/2}^{S_{Lat}/2}cos(\frac{2\pi.l}{S_{Lat}}).S_{Long} &amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The Atlas POV size. 15x15 means there are 15 POVs per line and per column.&lt;br /&gt;
* Single POV resolution&lt;br /&gt;
* The atlas coverage : if &amp;lt;math&amp;gt;\sqrt{N_{POV}}&amp;lt;/math&amp;gt; is an integer, the coverage will be 100% otherwise there will be blank slots in the atlas. 100% is better but not necessary.&lt;br /&gt;
* Unused memory : The estimated memory held by the blank slots in the grid. Will be 0 if the coverage is 100% &lt;br /&gt;
&lt;br /&gt;
On the right area stand 3 tabs for more visual information.&lt;br /&gt;
&lt;br /&gt;
* POVs : Visualize the Longitude / Latitude coverage. A great helper when tweaking the Quality Settings. You can orbit around with the mouse to see clearer.&lt;br /&gt;
* Layout : Visualize the Atlas  layout. Filled atlas slots will be green, blank will be red.&lt;br /&gt;
* Preview :  Visualize how pixelated your each single POV will be. Displays the actual objects entered in the Target foldout. You can orbit around with the mouse as well. &amp;lt;!-- Please note the snappiness/bluriness won't be previewed here. The area only shows your inputs layout in the impostor and the pixelization but does not stand for a contractual appearance of the ouput impostor. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LODGroup Settings ===&lt;br /&gt;
This category is not crucial since you can always modify it afterwards, but it can make you save a lot a time. If you just want to bake the impostor to a prefab without adding it to the scene, you can untick the field Automatic Setup.&lt;br /&gt;
[[File:Image 2024-02-06 183403606.png|center|thumb|394x394px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 4 possible scenarios for this area. &lt;br /&gt;
&lt;br /&gt;
* None of the input meshes are part of a LODGroup : A LODGroup will be added on the common ancestor. all the source renderers will be added in LOD0 and the impostor will be added in LOD1 following the given settings. A cross fading is added for smooth transitions.&lt;br /&gt;
* There is already a LODGroup but no impostors : The impostor will be added in an additional LOD level following the given parameters. Note that all the source renderers MUST belong to either no LOD or the same LOD level from the same LODGroup to avoid nested LODGroup errors.&lt;br /&gt;
* There is already a LODGroup with an impostor : The impostor will be replaced using the same relative height transition. Note that impostors are detected thanks to the ImpostorReference script attached to the LODGroup. If you want to have several impostors in the same LODGroup, just delete safely the ImpostorReference component before baking. Also, the previous impostor's prefab will not be deleted, only the instance in the scene will be replaced.&lt;br /&gt;
* There isn't any common ancestor for the input objects. Baking won't be possible.&lt;br /&gt;
&lt;br /&gt;
== Save Path ==&lt;br /&gt;
Impostors are saved as packed prefabs, embedding the quad mesh, the atlas(es) and the material. You can customize this path in this section.&lt;br /&gt;
[[File:Image 2024-02-06 184910768.png|center|thumb|401x401px]]&lt;br /&gt;
You can either type the path relative to the Assets folder or use the file browser with the dedicated button.&lt;br /&gt;
&lt;br /&gt;
The label underneath the text field hold the actual, unique path that will be used for the impostor. &lt;br /&gt;
&lt;br /&gt;
If the path contains one or more non-existing directories, they will be created automatically at baking time.&lt;br /&gt;
&lt;br /&gt;
Note that no file nor directory is created before baking. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Post-baking adjustments ==&lt;br /&gt;
Both the Lit and Unlit impostor materials have a custom Shader GUI where you can perform advanced post-baking adjustments.&lt;br /&gt;
[[File:Image 2024-02-06 190047781.png|center|thumb|865x865px]]&lt;br /&gt;
&lt;br /&gt;
=== Billboarding ===&lt;br /&gt;
The billboarding effect consists in making the quad face the camera at any time. This is performed in the vertex shader stage. &lt;br /&gt;
&lt;br /&gt;
* You can disable it with the dedicated toggle.&lt;br /&gt;
* Clamp Latitude will stop the vertical billboard effect if the view angle gets out of the latitudinal range. The horizontal billboarding will remain.&lt;br /&gt;
* Z Offset can get the a impostor closer from the camera. Really useful to get the most out of the LODGroup's crossfading effect, or to adapt the size at closer range without altering longer ranges.&lt;br /&gt;
&lt;br /&gt;
=== Surface ===&lt;br /&gt;
Due to the lack of smoothness, metallic and occlusion maps, it is sometimes required to tweak some surface parameters to match the source objects better.&lt;br /&gt;
* The Brightness slider can increase/decrease the albedo power.&lt;br /&gt;
* The Saturation slider can increase/decrease the color saturation.&lt;br /&gt;
* The Smoothness and Occlusion sliders work the same way than the default diffuse material. &lt;br /&gt;
* The Metallic slider is multiplied with the computed metallic map.&lt;br /&gt;
* The Curvature Occlusion slider applies an additionnal occlusion in rifts, and sharp angles, to estimate self-shades. Can create a gray outline on some objects.&lt;br /&gt;
&lt;br /&gt;
=== Contours ===&lt;br /&gt;
Impostors use opaque materials. To get the contours right we use alpha clipping to discard pixels that are not representing the object on each POV. The contours are usually fine out-of-the-box, but sometimes it is required to adjust a few settings.&lt;br /&gt;
* The Cutout slider can increase/decrease the sharpness of the alpha clipping geometry. You should not go higher than 0.5 to avoid cropping some important features.&lt;br /&gt;
&lt;br /&gt;
* The Interpolate toggle turns On/Off impostor bilinear interpolation smoothing. Interpolation removes the snapping effect, but adds blur. Note that interpolation adds shader complexity.&lt;br /&gt;
&lt;br /&gt;
* The Dithering Fade toggle turns On/Off Dithering fading on the edges of the impostor. Independant from the LODGroup crossfade effect.&lt;br /&gt;
[[File:2024-02-14-23-15-13.gif|center|From left to right: The original model, interpolation disabled, interpolation enabled.]]&lt;br /&gt;
&lt;br /&gt;
=== Geometry ===&lt;br /&gt;
These settings are theoritically not needed but give additionnal freedom to advanced users.&lt;br /&gt;
* The Yaw/Elevation offset sliders make the object virtually rotate on the Horizontal/Vertical axis respectively. &lt;br /&gt;
&lt;br /&gt;
=== Advanced Options ===&lt;br /&gt;
You can control the Render Queue, Double sided Global Illumation and GPU instancing, like the default surface shader. &lt;br /&gt;
&lt;br /&gt;
== Compatible objects ==&lt;br /&gt;
Mirage Impostors are compatible with any object with a MeshFilter and a MeshRenderer attached. &lt;br /&gt;
&lt;br /&gt;
Note that translations (on all axes), scaling (on all axes) and rotation (around the vertical axis only) are supported. &lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
Due to their nature, Mirage impostors have their few limitations.&lt;br /&gt;
&lt;br /&gt;
* Full rotation compatibility : as said just above, the impostors won't be rotated around X and Z axes even if their parent does. &lt;br /&gt;
* Lossy scale : Mirage uses the transforms [https://docs.unity3d.com/ScriptReference/Transform-lossyScale.html lossyScale] of the source objects. If the source objects are skewed by nested non uniform scaling a rotation, the impostor may be a appear close from but source but unskewed.&lt;br /&gt;
* Shadows : Mirage impostors are compatible with shadows but they are not physically correct since it only projects the alpha clipped quad instead of having a dedicated shadow pass. It means shadow will be correct if the light comes from the front or the back but not the sides of the impostor. This is a simplicity choice, since correct shadow would add a GPU-intensive shader pass and shadows are usually not even visible from the impostor nominal distance. Moreover, it keeps Mirage natively pipeline independant since shader graph is not designed to add custom passes.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Didn't find what you were searching for?&lt;br /&gt;
&lt;br /&gt;
Feel free to contact me by email or on my discord channel.&lt;br /&gt;
&lt;br /&gt;
[mailto:support@leochaumartin.com support@leochaumartin.com]&lt;br /&gt;
&lt;br /&gt;
https://discord.gg/kYwzdvAt8q&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://www.gamedeveloper.com/programming/dynamic-2d-imposters-a-simple-efficient-directx-9-implementation&lt;br /&gt;
&lt;br /&gt;
https://calcifer.org/kenneth-christiansen/ComputerScience/imposters.pdf&lt;br /&gt;
&lt;br /&gt;
https://developer.nvidia.com/gpugems/gpugems3/part-iv-image-effects/chapter-21-true-impostors&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=162</id>
		<title>Mirage</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=162"/>
		<updated>2024-02-14T22:26:31Z</updated>

		<summary type="html">&lt;p&gt;Lch: /* Contours */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Setup ==&lt;br /&gt;
The whole package is contained in the Mirage folder resulting from the import but you can move it wherever you want.&lt;br /&gt;
&lt;br /&gt;
== What is an impostor ==&lt;br /&gt;
An impostor or imposter is a dynamically rendered billboard texture map used to give an illusion of 3D geometry in the distance. &lt;br /&gt;
&lt;br /&gt;
In Mirage context, you can have as many objects as you want in a single impostor, and all the the points of view are stored into an abedo map and optional normal map and metallic map atlases per impostor. Smoothness or occlusion are not baked into textures but are still customizable on post baking options.&lt;br /&gt;
== How to bake your first impostor ==&lt;br /&gt;
&amp;lt;code&amp;gt;Mirage&amp;lt;/code&amp;gt; consists in a single editor window. You can open it via &amp;lt;code&amp;gt;Window-&amp;gt;Mirage-&amp;gt;Impostors&amp;lt;/code&amp;gt;. For a simple one-click impostor approach, drag and drop the common ancestor of all the objects you want to bake into target area and click on the &amp;lt;code&amp;gt;Generate Impostor&amp;lt;/code&amp;gt; button. &lt;br /&gt;
&lt;br /&gt;
You can also customize a lot of settings for a more advanced usage. There are 5 category foldouts that can expanded or hidden by clicking on their title. Even when hidden, they still provide basic information or controls on the right of the title. &lt;br /&gt;
&lt;br /&gt;
The following sections will provide detailed explaination of each category.[[File:Image 2024-02-06 164734156.png|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
=== Setup the target(s) ===&lt;br /&gt;
This category holds all the source object(s) information. Note that only one impostor can be baked at a time, so all the target will all be part of the same impostor. &lt;br /&gt;
For a simple approach, drag and drop the common ancestor in the dedicated field. Note that if you want to bake only one object the common ancestor can be the object itself or its parent. When the common ancestor is set, Mirage will automatically detect all the mesh filters in its children, recursively. You can check which mesh filters are included by expanding the section as following. Null or invalid objects will be ignored. &lt;br /&gt;
[[File:Image 2024-02-06 170842562.png|center|thumb|357x357px]]&lt;br /&gt;
You can also exclude some meshes or add some manually by dropping them into the area. If you change the mesh filters manually, the common ancestor will be updated accordingly. Note that '''a common ancestor is needed to bake an impostor'''. &lt;br /&gt;
&lt;br /&gt;
=== Quality Settings ===&lt;br /&gt;
This category is crucial and will have a direct impact on the visual quality of the impostor as it provides full control over the baking topology. This section should be paired with the &amp;lt;code&amp;gt;Information&amp;lt;/code&amp;gt; category that provides real-time visualization for an excellent and fast control over the baking topology.&lt;br /&gt;
[[File:Image 2024-02-06 172158522.png|center|thumb|483x483px]]&lt;br /&gt;
&lt;br /&gt;
==== Texture Size ====&lt;br /&gt;
As previously mentionned, Color, Normal and Metallic Maps are stored into square POT atlases. This field controls the resolution of these atlases, from 128x128 to 4096x4096. The &amp;lt;code&amp;gt;Estimated total size&amp;lt;/code&amp;gt; label provides the size of the whole impostor prefab after baking (with DXT compression) &lt;br /&gt;
&lt;br /&gt;
==== Sphere Type ====&lt;br /&gt;
&lt;br /&gt;
*'''UV sphere''': The default choice.  The UV sphere is based on a fixed number of longitude and latitude samples.  The coverage is denser at the poles.The UV Sphere is a solid choice in many use cases, with more versatility regarding partial sphere baking.&lt;br /&gt;
*'''Pseudo-Fibonacci sphere''': at an experimental stage.  Provides a homogeneous coverage. Not compatible with latitude interpolation in the impostor shader. Despite being homogeneous, the output impostor will look smooth near the equator, with more noticeable snaps or blur around the poles. Full sphere baking only.&lt;br /&gt;
&lt;br /&gt;
==== Longitude Samples ====&lt;br /&gt;
UV Sphere only. Holds the number of longitudinal samples. The higher the better for smooth horizontal rotation, at a cost of higher POV number thus lower resolution/POV in the atlas. All samples are equally spread around the 360 degrees.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Samples ====&lt;br /&gt;
UV Sphere only. Holds half of the number of latitudinal samples (equator excluded). This means that a 0 value will just bake around the equator. 1 will bake an additionnal sample on each side of the equator, and so on.&lt;br /&gt;
&lt;br /&gt;
The higher the better for smooth vertical rotation, at a cost of higher POV number thus lower resolution/POV in the atlas. &lt;br /&gt;
&lt;br /&gt;
==== Latitude Offset ====&lt;br /&gt;
UV Sphere only. Shifts the equator sample. Useful for partial spheres.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Step ====&lt;br /&gt;
UV Sphere only. Holds angular offset between two latitudinal samples. A small value will increase smoothness of vertical rotation, but may limit the global latitudinal range.  &lt;br /&gt;
&lt;br /&gt;
==== Density ====&lt;br /&gt;
Pseudo-Fibonacci sphere only. Controls the density of the sphere. The higher the better for smooth rotations in any direction, at a cost of higher POV number thus lower resolution/POV in the atlas.&lt;br /&gt;
&lt;br /&gt;
==== Lighting Method ====&lt;br /&gt;
&lt;br /&gt;
# '''Surface Estimation:''' Computes dedicated normal and metallic map atlases to get physically correct light reflections on the impostor. The recommended method. The baked impostor will use a lit surface shader.&lt;br /&gt;
# '''Use Scene Sun Source:''' Adds the sun source of the opened scene in the baking context. Can provide better results on single lit scenes, especially with intricate smoothness/occlusion materials. The baked impostor will use an unlit shader.&lt;br /&gt;
&lt;br /&gt;
==== Presets ====&lt;br /&gt;
You can add/load presets easily with the dedicated buttons. Gives an additional degree of freedom to match your workflow. A few relevant presets are already included such as 1-POV-billboard or different hemispheres.&lt;br /&gt;
&lt;br /&gt;
=== Information ===&lt;br /&gt;
The whole information foldout is readonly. It provides useful visual feedback to help tweaking the previous category fields.&lt;br /&gt;
&lt;br /&gt;
[[File:Image 2024-02-06 180549368.png|center|thumb|426x426px]]&lt;br /&gt;
On the left column, some metrics are displayed. The values will appear in green is considered valid, orange when considered too low/high. Please note that these colors are purely informative and won't inhibit the impostor generation. &lt;br /&gt;
&lt;br /&gt;
* The total number of POV.  &lt;br /&gt;
** For UV Sphere Baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = S_{Long}*S_{Lat}&amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
** For Pseudo-Fibonacci Sphere baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = \sum_{l=-S_{Lat}/2}^{S_{Lat}/2}cos(\frac{2\pi.l}{S_{Lat}}).S_{Long} &amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The Atlas POV size. 15x15 means there are 15 POVs per line and per column.&lt;br /&gt;
* Single POV resolution&lt;br /&gt;
* The atlas coverage : if &amp;lt;math&amp;gt;\sqrt{N_{POV}}&amp;lt;/math&amp;gt; is an integer, the coverage will be 100% otherwise there will be blank slots in the atlas. 100% is better but not necessary.&lt;br /&gt;
* Unused memory : The estimated memory held by the blank slots in the grid. Will be 0 if the coverage is 100% &lt;br /&gt;
&lt;br /&gt;
On the right area stand 3 tabs for more visual information.&lt;br /&gt;
&lt;br /&gt;
* POVs : Visualize the Longitude / Latitude coverage. A great helper when tweaking the Quality Settings. You can orbit around with the mouse to see clearer.&lt;br /&gt;
* Layout : Visualize the Atlas  layout. Filled atlas slots will be green, blank will be red.&lt;br /&gt;
* Preview :  Visualize how pixelated your each single POV will be. Displays the actual objects entered in the Target foldout. You can orbit around with the mouse as well. &amp;lt;!-- Please note the snappiness/bluriness won't be previewed here. The area only shows your inputs layout in the impostor and the pixelization but does not stand for a contractual appearance of the ouput impostor. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LODGroup Settings ===&lt;br /&gt;
This category is not crucial since you can always modify it afterwards, but it can make you save a lot a time. If you just want to bake the impostor to a prefab without adding it to the scene, you can untick the field Automatic Setup.&lt;br /&gt;
[[File:Image 2024-02-06 183403606.png|center|thumb|394x394px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 4 possible scenarios for this area. &lt;br /&gt;
&lt;br /&gt;
* None of the input meshes are part of a LODGroup : A LODGroup will be added on the common ancestor. all the source renderers will be added in LOD0 and the impostor will be added in LOD1 following the given settings. A cross fading is added for smooth transitions.&lt;br /&gt;
* There is already a LODGroup but no impostors : The impostor will be added in an additional LOD level following the given parameters. Note that all the source renderers MUST belong to either no LOD or the same LOD level from the same LODGroup to avoid nested LODGroup errors.&lt;br /&gt;
* There is already a LODGroup with an impostor : The impostor will be replaced using the same relative height transition. Note that impostors are detected thanks to the ImpostorReference script attached to the LODGroup. If you want to have several impostors in the same LODGroup, just delete safely the ImpostorReference component before baking. Also, the previous impostor's prefab will not be deleted, only the instance in the scene will be replaced.&lt;br /&gt;
* There isn't any common ancestor for the input objects. Baking won't be possible.&lt;br /&gt;
&lt;br /&gt;
== Save Path ==&lt;br /&gt;
Impostors are saved as packed prefabs, embedding the quad mesh, the atlas(es) and the material. You can customize this path in this section.&lt;br /&gt;
[[File:Image 2024-02-06 184910768.png|center|thumb|401x401px]]&lt;br /&gt;
You can either type the path relative to the Assets folder or use the file browser with the dedicated button.&lt;br /&gt;
&lt;br /&gt;
The label underneath the text field hold the actual, unique path that will be used for the impostor. &lt;br /&gt;
&lt;br /&gt;
If the path contains one or more non-existing directories, they will be created automatically at baking time.&lt;br /&gt;
&lt;br /&gt;
Note that no file nor directory is created before baking. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Post-baking adjustments ==&lt;br /&gt;
Both the Lit and Unlit impostor materials have a custom Shader GUI where you can perform advanced post-baking adjustments.&lt;br /&gt;
[[File:Image 2024-02-06 190047781.png|center|thumb|865x865px]]&lt;br /&gt;
&lt;br /&gt;
=== Billboarding ===&lt;br /&gt;
The billboarding effect consists in making the quad face the camera at any time. This is performed in the vertex shader stage. &lt;br /&gt;
&lt;br /&gt;
* You can disable it with the dedicated toggle.&lt;br /&gt;
* Clamp Latitude will stop the vertical billboard effect if the view angle gets out of the latitudinal range. The horizontal billboarding will remain.&lt;br /&gt;
* Z Offset can get the a impostor closer from the camera. Really useful to get the most out of the LODGroup's crossfading effect, or to adapt the size at closer range without altering longer ranges.&lt;br /&gt;
&lt;br /&gt;
=== Surface ===&lt;br /&gt;
Due to the lack of smoothness, metallic and occlusion maps, it is sometimes required to tweak some surface parameters to match the source objects better.&lt;br /&gt;
* The Brightness slider can increase/decrease the albedo power.&lt;br /&gt;
* The Saturation slider can increase/decrease the color saturation.&lt;br /&gt;
* The Smoothness and Occlusion sliders work the same way than the default diffuse material. &lt;br /&gt;
* The Metallic slider is multiplied with the computed metallic map.&lt;br /&gt;
* The Curvature Occlusion slider applies an additionnal occlusion in rifts, and sharp angles, to estimate self-shades. Can create a gray outline on some objects.&lt;br /&gt;
&lt;br /&gt;
=== Contours ===&lt;br /&gt;
Impostors use opaque materials. To get the contours right we use alpha clipping to discard pixels that are not representing the object on each POV. The contours are usually fine out-of-the-box, but sometimes it is required to adjust a few settings.&lt;br /&gt;
* The Cutout slider can increase/decrease the sharpness of the alpha clipping geometry. You should not go higher than 0.5 to avoid cropping some important features.&lt;br /&gt;
&lt;br /&gt;
* The Interpolate toggle turns On/Off impostor bilinear interpolation smoothing. Interpolation removes the snapping effect, but adds blur. Note that interpolation adds shader complexity.&lt;br /&gt;
&lt;br /&gt;
* The Dithering Fade toggle turns On/Off Dithering fading on the edges of the impostor. Independant from the LODGroup crossfade effect.&lt;br /&gt;
[[File:2024-02-14-23-15-13.gif|center|From left to right: The original model, interpolation disabled, interpolation enabled.]]&lt;br /&gt;
&lt;br /&gt;
=== Geometry ===&lt;br /&gt;
These settings are theoritically not needed but give additionnal freedom to advanced users.&lt;br /&gt;
* The Yaw/Elevation offset sliders make the object virtually rotate on the Horizontal/Vertical axis respectively. &lt;br /&gt;
&lt;br /&gt;
=== Advanced Options ===&lt;br /&gt;
You can control the Render Queue, Double sided Global Illumation and GPU instancing, like the default surface shader. &lt;br /&gt;
&lt;br /&gt;
== Compatible objects ==&lt;br /&gt;
Mirage Impostors are compatible with any object with a MeshFilter and a MeshRenderer attached. &lt;br /&gt;
&lt;br /&gt;
Note that translations (on all axes), scaling (on all axes) and rotation (around the vertical axis only) are supported. &lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
Due to their nature, Mirage impostors have their few limitations.&lt;br /&gt;
&lt;br /&gt;
* Full rotation compatibility : as said just above, the impostors won't be rotated around X and Z axes even if their parent does. &lt;br /&gt;
* Lossy scale : Mirage uses the transforms [https://docs.unity3d.com/ScriptReference/Transform-lossyScale.html lossyScale] of the source objects. If the source objects are skewed by nested non uniform scaling a rotation, the impostor may be a appear close from but source but unskewed.&lt;br /&gt;
* Shadows : Mirage impostors are compatible with shadows but they are not physically correct since it only projects the alpha clipped quad instead of having a dedicated shadow pass. It means shadow will be correct if the light comes from the front or the back but not the sides of the impostor. This is a simplicity choice, since correct shadow would add a GPU-intensive shader pass and shadows are usually not even visible from the impostor nominal distance. Moreover, it keeps Mirage natively pipeline independant since shader graph is not designed to add custom passes.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Didn't find what you were searching for?&lt;br /&gt;
&lt;br /&gt;
Feel free to contact me by email or on my discord channel.&lt;br /&gt;
&lt;br /&gt;
[mailto:support@leochaumartin.com support@leochaumartin.com]&lt;br /&gt;
&lt;br /&gt;
https://discord.gg/kYwzdvAt8q&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://www.gamedeveloper.com/programming/dynamic-2d-imposters-a-simple-efficient-directx-9-implementation&lt;br /&gt;
&lt;br /&gt;
https://calcifer.org/kenneth-christiansen/ComputerScience/imposters.pdf&lt;br /&gt;
&lt;br /&gt;
https://developer.nvidia.com/gpugems/gpugems3/part-iv-image-effects/chapter-21-true-impostors&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=File:2024-02-14-23-15-13.gif&amp;diff=161</id>
		<title>File:2024-02-14-23-15-13.gif</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=File:2024-02-14-23-15-13.gif&amp;diff=161"/>
		<updated>2024-02-14T22:23:52Z</updated>

		<summary type="html">&lt;p&gt;Lch: Lch uploaded a new version of File:2024-02-14-23-15-13.gif&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mirage impostors : interpolation&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=160</id>
		<title>Mirage</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=160"/>
		<updated>2024-02-14T22:17:38Z</updated>

		<summary type="html">&lt;p&gt;Lch: /* Contours */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Setup ==&lt;br /&gt;
The whole package is contained in the Mirage folder resulting from the import but you can move it wherever you want.&lt;br /&gt;
&lt;br /&gt;
== What is an impostor ==&lt;br /&gt;
An impostor or imposter is a dynamically rendered billboard texture map used to give an illusion of 3D geometry in the distance. &lt;br /&gt;
&lt;br /&gt;
In Mirage context, you can have as many objects as you want in a single impostor, and all the the points of view are stored into an abedo map and optional normal map and metallic map atlases per impostor. Smoothness or occlusion are not baked into textures but are still customizable on post baking options.&lt;br /&gt;
== How to bake your first impostor ==&lt;br /&gt;
&amp;lt;code&amp;gt;Mirage&amp;lt;/code&amp;gt; consists in a single editor window. You can open it via &amp;lt;code&amp;gt;Window-&amp;gt;Mirage-&amp;gt;Impostors&amp;lt;/code&amp;gt;. For a simple one-click impostor approach, drag and drop the common ancestor of all the objects you want to bake into target area and click on the &amp;lt;code&amp;gt;Generate Impostor&amp;lt;/code&amp;gt; button. &lt;br /&gt;
&lt;br /&gt;
You can also customize a lot of settings for a more advanced usage. There are 5 category foldouts that can expanded or hidden by clicking on their title. Even when hidden, they still provide basic information or controls on the right of the title. &lt;br /&gt;
&lt;br /&gt;
The following sections will provide detailed explaination of each category.[[File:Image 2024-02-06 164734156.png|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
=== Setup the target(s) ===&lt;br /&gt;
This category holds all the source object(s) information. Note that only one impostor can be baked at a time, so all the target will all be part of the same impostor. &lt;br /&gt;
For a simple approach, drag and drop the common ancestor in the dedicated field. Note that if you want to bake only one object the common ancestor can be the object itself or its parent. When the common ancestor is set, Mirage will automatically detect all the mesh filters in its children, recursively. You can check which mesh filters are included by expanding the section as following. Null or invalid objects will be ignored. &lt;br /&gt;
[[File:Image 2024-02-06 170842562.png|center|thumb|357x357px]]&lt;br /&gt;
You can also exclude some meshes or add some manually by dropping them into the area. If you change the mesh filters manually, the common ancestor will be updated accordingly. Note that '''a common ancestor is needed to bake an impostor'''. &lt;br /&gt;
&lt;br /&gt;
=== Quality Settings ===&lt;br /&gt;
This category is crucial and will have a direct impact on the visual quality of the impostor as it provides full control over the baking topology. This section should be paired with the &amp;lt;code&amp;gt;Information&amp;lt;/code&amp;gt; category that provides real-time visualization for an excellent and fast control over the baking topology.&lt;br /&gt;
[[File:Image 2024-02-06 172158522.png|center|thumb|483x483px]]&lt;br /&gt;
&lt;br /&gt;
==== Texture Size ====&lt;br /&gt;
As previously mentionned, Color, Normal and Metallic Maps are stored into square POT atlases. This field controls the resolution of these atlases, from 128x128 to 4096x4096. The &amp;lt;code&amp;gt;Estimated total size&amp;lt;/code&amp;gt; label provides the size of the whole impostor prefab after baking (with DXT compression) &lt;br /&gt;
&lt;br /&gt;
==== Sphere Type ====&lt;br /&gt;
&lt;br /&gt;
*'''UV sphere''': The default choice.  The UV sphere is based on a fixed number of longitude and latitude samples.  The coverage is denser at the poles.The UV Sphere is a solid choice in many use cases, with more versatility regarding partial sphere baking.&lt;br /&gt;
*'''Pseudo-Fibonacci sphere''': at an experimental stage.  Provides a homogeneous coverage. Not compatible with latitude interpolation in the impostor shader. Despite being homogeneous, the output impostor will look smooth near the equator, with more noticeable snaps or blur around the poles. Full sphere baking only.&lt;br /&gt;
&lt;br /&gt;
==== Longitude Samples ====&lt;br /&gt;
UV Sphere only. Holds the number of longitudinal samples. The higher the better for smooth horizontal rotation, at a cost of higher POV number thus lower resolution/POV in the atlas. All samples are equally spread around the 360 degrees.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Samples ====&lt;br /&gt;
UV Sphere only. Holds half of the number of latitudinal samples (equator excluded). This means that a 0 value will just bake around the equator. 1 will bake an additionnal sample on each side of the equator, and so on.&lt;br /&gt;
&lt;br /&gt;
The higher the better for smooth vertical rotation, at a cost of higher POV number thus lower resolution/POV in the atlas. &lt;br /&gt;
&lt;br /&gt;
==== Latitude Offset ====&lt;br /&gt;
UV Sphere only. Shifts the equator sample. Useful for partial spheres.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Step ====&lt;br /&gt;
UV Sphere only. Holds angular offset between two latitudinal samples. A small value will increase smoothness of vertical rotation, but may limit the global latitudinal range.  &lt;br /&gt;
&lt;br /&gt;
==== Density ====&lt;br /&gt;
Pseudo-Fibonacci sphere only. Controls the density of the sphere. The higher the better for smooth rotations in any direction, at a cost of higher POV number thus lower resolution/POV in the atlas.&lt;br /&gt;
&lt;br /&gt;
==== Lighting Method ====&lt;br /&gt;
&lt;br /&gt;
# '''Surface Estimation:''' Computes dedicated normal and metallic map atlases to get physically correct light reflections on the impostor. The recommended method. The baked impostor will use a lit surface shader.&lt;br /&gt;
# '''Use Scene Sun Source:''' Adds the sun source of the opened scene in the baking context. Can provide better results on single lit scenes, especially with intricate smoothness/occlusion materials. The baked impostor will use an unlit shader.&lt;br /&gt;
&lt;br /&gt;
==== Presets ====&lt;br /&gt;
You can add/load presets easily with the dedicated buttons. Gives an additional degree of freedom to match your workflow. A few relevant presets are already included such as 1-POV-billboard or different hemispheres.&lt;br /&gt;
&lt;br /&gt;
=== Information ===&lt;br /&gt;
The whole information foldout is readonly. It provides useful visual feedback to help tweaking the previous category fields.&lt;br /&gt;
&lt;br /&gt;
[[File:Image 2024-02-06 180549368.png|center|thumb|426x426px]]&lt;br /&gt;
On the left column, some metrics are displayed. The values will appear in green is considered valid, orange when considered too low/high. Please note that these colors are purely informative and won't inhibit the impostor generation. &lt;br /&gt;
&lt;br /&gt;
* The total number of POV.  &lt;br /&gt;
** For UV Sphere Baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = S_{Long}*S_{Lat}&amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
** For Pseudo-Fibonacci Sphere baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = \sum_{l=-S_{Lat}/2}^{S_{Lat}/2}cos(\frac{2\pi.l}{S_{Lat}}).S_{Long} &amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The Atlas POV size. 15x15 means there are 15 POVs per line and per column.&lt;br /&gt;
* Single POV resolution&lt;br /&gt;
* The atlas coverage : if &amp;lt;math&amp;gt;\sqrt{N_{POV}}&amp;lt;/math&amp;gt; is an integer, the coverage will be 100% otherwise there will be blank slots in the atlas. 100% is better but not necessary.&lt;br /&gt;
* Unused memory : The estimated memory held by the blank slots in the grid. Will be 0 if the coverage is 100% &lt;br /&gt;
&lt;br /&gt;
On the right area stand 3 tabs for more visual information.&lt;br /&gt;
&lt;br /&gt;
* POVs : Visualize the Longitude / Latitude coverage. A great helper when tweaking the Quality Settings. You can orbit around with the mouse to see clearer.&lt;br /&gt;
* Layout : Visualize the Atlas  layout. Filled atlas slots will be green, blank will be red.&lt;br /&gt;
* Preview :  Visualize how pixelated your each single POV will be. Displays the actual objects entered in the Target foldout. You can orbit around with the mouse as well. &amp;lt;!-- Please note the snappiness/bluriness won't be previewed here. The area only shows your inputs layout in the impostor and the pixelization but does not stand for a contractual appearance of the ouput impostor. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LODGroup Settings ===&lt;br /&gt;
This category is not crucial since you can always modify it afterwards, but it can make you save a lot a time. If you just want to bake the impostor to a prefab without adding it to the scene, you can untick the field Automatic Setup.&lt;br /&gt;
[[File:Image 2024-02-06 183403606.png|center|thumb|394x394px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 4 possible scenarios for this area. &lt;br /&gt;
&lt;br /&gt;
* None of the input meshes are part of a LODGroup : A LODGroup will be added on the common ancestor. all the source renderers will be added in LOD0 and the impostor will be added in LOD1 following the given settings. A cross fading is added for smooth transitions.&lt;br /&gt;
* There is already a LODGroup but no impostors : The impostor will be added in an additional LOD level following the given parameters. Note that all the source renderers MUST belong to either no LOD or the same LOD level from the same LODGroup to avoid nested LODGroup errors.&lt;br /&gt;
* There is already a LODGroup with an impostor : The impostor will be replaced using the same relative height transition. Note that impostors are detected thanks to the ImpostorReference script attached to the LODGroup. If you want to have several impostors in the same LODGroup, just delete safely the ImpostorReference component before baking. Also, the previous impostor's prefab will not be deleted, only the instance in the scene will be replaced.&lt;br /&gt;
* There isn't any common ancestor for the input objects. Baking won't be possible.&lt;br /&gt;
&lt;br /&gt;
== Save Path ==&lt;br /&gt;
Impostors are saved as packed prefabs, embedding the quad mesh, the atlas(es) and the material. You can customize this path in this section.&lt;br /&gt;
[[File:Image 2024-02-06 184910768.png|center|thumb|401x401px]]&lt;br /&gt;
You can either type the path relative to the Assets folder or use the file browser with the dedicated button.&lt;br /&gt;
&lt;br /&gt;
The label underneath the text field hold the actual, unique path that will be used for the impostor. &lt;br /&gt;
&lt;br /&gt;
If the path contains one or more non-existing directories, they will be created automatically at baking time.&lt;br /&gt;
&lt;br /&gt;
Note that no file nor directory is created before baking. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Post-baking adjustments ==&lt;br /&gt;
Both the Lit and Unlit impostor materials have a custom Shader GUI where you can perform advanced post-baking adjustments.&lt;br /&gt;
[[File:Image 2024-02-06 190047781.png|center|thumb|865x865px]]&lt;br /&gt;
&lt;br /&gt;
=== Billboarding ===&lt;br /&gt;
The billboarding effect consists in making the quad face the camera at any time. This is performed in the vertex shader stage. &lt;br /&gt;
&lt;br /&gt;
* You can disable it with the dedicated toggle.&lt;br /&gt;
* Clamp Latitude will stop the vertical billboard effect if the view angle gets out of the latitudinal range. The horizontal billboarding will remain.&lt;br /&gt;
* Z Offset can get the a impostor closer from the camera. Really useful to get the most out of the LODGroup's crossfading effect, or to adapt the size at closer range without altering longer ranges.&lt;br /&gt;
&lt;br /&gt;
=== Surface ===&lt;br /&gt;
Due to the lack of smoothness, metallic and occlusion maps, it is sometimes required to tweak some surface parameters to match the source objects better.&lt;br /&gt;
* The Brightness slider can increase/decrease the albedo power.&lt;br /&gt;
* The Saturation slider can increase/decrease the color saturation.&lt;br /&gt;
* The Smoothness and Occlusion sliders work the same way than the default diffuse material. &lt;br /&gt;
* The Metallic slider is multiplied with the computed metallic map.&lt;br /&gt;
* The Curvature Occlusion slider applies an additionnal occlusion in rifts, and sharp angles, to estimate self-shades. Can create a gray outline on some objects.&lt;br /&gt;
&lt;br /&gt;
=== Contours ===&lt;br /&gt;
Impostors use opaque materials. To get the contours right we use alpha clipping to discard pixels that are not representing the object on each POV. The contours are usually fine out-of-the-box, but sometimes it is required to adjust a few settings.&lt;br /&gt;
* The Cutout slider can increase/decrease the sharpness of the alpha clipping geometry. You should not go higher than 0.5 to avoid cropping some important features.&lt;br /&gt;
&lt;br /&gt;
* The Interpolate toggle turns On/Off impostor bilinear interpolation smoothing. Interpolation removes the snapping effect, but adds blur. Note that interpolation adds shader complexity.&lt;br /&gt;
&lt;br /&gt;
* The Dithering Fade toggle turns On/Off Dithering fading on the edges of the impostor. Independant from the LODGroup crossfade effect.&lt;br /&gt;
[[File:2024-02-14-23-15-13.gif|center|thumb|429x429px|From left to right: The original model, interpolation disabled, interpolation enabled.]]&lt;br /&gt;
&lt;br /&gt;
=== Geometry ===&lt;br /&gt;
These settings are theoritically not needed but give additionnal freedom to advanced users.&lt;br /&gt;
* The Yaw/Elevation offset sliders make the object virtually rotate on the Horizontal/Vertical axis respectively. &lt;br /&gt;
&lt;br /&gt;
=== Advanced Options ===&lt;br /&gt;
You can control the Render Queue, Double sided Global Illumation and GPU instancing, like the default surface shader. &lt;br /&gt;
&lt;br /&gt;
== Compatible objects ==&lt;br /&gt;
Mirage Impostors are compatible with any object with a MeshFilter and a MeshRenderer attached. &lt;br /&gt;
&lt;br /&gt;
Note that translations (on all axes), scaling (on all axes) and rotation (around the vertical axis only) are supported. &lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
Due to their nature, Mirage impostors have their few limitations.&lt;br /&gt;
&lt;br /&gt;
* Full rotation compatibility : as said just above, the impostors won't be rotated around X and Z axes even if their parent does. &lt;br /&gt;
* Lossy scale : Mirage uses the transforms [https://docs.unity3d.com/ScriptReference/Transform-lossyScale.html lossyScale] of the source objects. If the source objects are skewed by nested non uniform scaling a rotation, the impostor may be a appear close from but source but unskewed.&lt;br /&gt;
* Shadows : Mirage impostors are compatible with shadows but they are not physically correct since it only projects the alpha clipped quad instead of having a dedicated shadow pass. It means shadow will be correct if the light comes from the front or the back but not the sides of the impostor. This is a simplicity choice, since correct shadow would add a GPU-intensive shader pass and shadows are usually not even visible from the impostor nominal distance. Moreover, it keeps Mirage natively pipeline independant since shader graph is not designed to add custom passes.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Didn't find what you were searching for?&lt;br /&gt;
&lt;br /&gt;
Feel free to contact me by email or on my discord channel.&lt;br /&gt;
&lt;br /&gt;
[mailto:support@leochaumartin.com support@leochaumartin.com]&lt;br /&gt;
&lt;br /&gt;
https://discord.gg/kYwzdvAt8q&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://www.gamedeveloper.com/programming/dynamic-2d-imposters-a-simple-efficient-directx-9-implementation&lt;br /&gt;
&lt;br /&gt;
https://calcifer.org/kenneth-christiansen/ComputerScience/imposters.pdf&lt;br /&gt;
&lt;br /&gt;
https://developer.nvidia.com/gpugems/gpugems3/part-iv-image-effects/chapter-21-true-impostors&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=File:2024-02-14-23-15-13.gif&amp;diff=159</id>
		<title>File:2024-02-14-23-15-13.gif</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=File:2024-02-14-23-15-13.gif&amp;diff=159"/>
		<updated>2024-02-14T22:17:13Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mirage impostors : interpolation&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=158</id>
		<title>Mirage</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=158"/>
		<updated>2024-02-13T10:33:14Z</updated>

		<summary type="html">&lt;p&gt;Lch: /* Setup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Setup ==&lt;br /&gt;
The whole package is contained in the Mirage folder resulting from the import but you can move it wherever you want.&lt;br /&gt;
&lt;br /&gt;
== What is an impostor ==&lt;br /&gt;
An impostor or imposter is a dynamically rendered billboard texture map used to give an illusion of 3D geometry in the distance. &lt;br /&gt;
&lt;br /&gt;
In Mirage context, you can have as many objects as you want in a single impostor, and all the the points of view are stored into an abedo map and optional normal map and metallic map atlases per impostor. Smoothness or occlusion are not baked into textures but are still customizable on post baking options.&lt;br /&gt;
== How to bake your first impostor ==&lt;br /&gt;
&amp;lt;code&amp;gt;Mirage&amp;lt;/code&amp;gt; consists in a single editor window. You can open it via &amp;lt;code&amp;gt;Window-&amp;gt;Mirage-&amp;gt;Impostors&amp;lt;/code&amp;gt;. For a simple one-click impostor approach, drag and drop the common ancestor of all the objects you want to bake into target area and click on the &amp;lt;code&amp;gt;Generate Impostor&amp;lt;/code&amp;gt; button. &lt;br /&gt;
&lt;br /&gt;
You can also customize a lot of settings for a more advanced usage. There are 5 category foldouts that can expanded or hidden by clicking on their title. Even when hidden, they still provide basic information or controls on the right of the title. &lt;br /&gt;
&lt;br /&gt;
The following sections will provide detailed explaination of each category.[[File:Image 2024-02-06 164734156.png|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
=== Setup the target(s) ===&lt;br /&gt;
This category holds all the source object(s) information. Note that only one impostor can be baked at a time, so all the target will all be part of the same impostor. &lt;br /&gt;
For a simple approach, drag and drop the common ancestor in the dedicated field. Note that if you want to bake only one object the common ancestor can be the object itself or its parent. When the common ancestor is set, Mirage will automatically detect all the mesh filters in its children, recursively. You can check which mesh filters are included by expanding the section as following. Null or invalid objects will be ignored. &lt;br /&gt;
[[File:Image 2024-02-06 170842562.png|center|thumb|357x357px]]&lt;br /&gt;
You can also exclude some meshes or add some manually by dropping them into the area. If you change the mesh filters manually, the common ancestor will be updated accordingly. Note that '''a common ancestor is needed to bake an impostor'''. &lt;br /&gt;
&lt;br /&gt;
=== Quality Settings ===&lt;br /&gt;
This category is crucial and will have a direct impact on the visual quality of the impostor as it provides full control over the baking topology. This section should be paired with the &amp;lt;code&amp;gt;Information&amp;lt;/code&amp;gt; category that provides real-time visualization for an excellent and fast control over the baking topology.&lt;br /&gt;
[[File:Image 2024-02-06 172158522.png|center|thumb|483x483px]]&lt;br /&gt;
&lt;br /&gt;
==== Texture Size ====&lt;br /&gt;
As previously mentionned, Color, Normal and Metallic Maps are stored into square POT atlases. This field controls the resolution of these atlases, from 128x128 to 4096x4096. The &amp;lt;code&amp;gt;Estimated total size&amp;lt;/code&amp;gt; label provides the size of the whole impostor prefab after baking (with DXT compression) &lt;br /&gt;
&lt;br /&gt;
==== Sphere Type ====&lt;br /&gt;
&lt;br /&gt;
*'''UV sphere''': The default choice.  The UV sphere is based on a fixed number of longitude and latitude samples.  The coverage is denser at the poles.The UV Sphere is a solid choice in many use cases, with more versatility regarding partial sphere baking.&lt;br /&gt;
*'''Pseudo-Fibonacci sphere''': at an experimental stage.  Provides a homogeneous coverage. Not compatible with latitude interpolation in the impostor shader. Despite being homogeneous, the output impostor will look smooth near the equator, with more noticeable snaps or blur around the poles. Full sphere baking only.&lt;br /&gt;
&lt;br /&gt;
==== Longitude Samples ====&lt;br /&gt;
UV Sphere only. Holds the number of longitudinal samples. The higher the better for smooth horizontal rotation, at a cost of higher POV number thus lower resolution/POV in the atlas. All samples are equally spread around the 360 degrees.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Samples ====&lt;br /&gt;
UV Sphere only. Holds half of the number of latitudinal samples (equator excluded). This means that a 0 value will just bake around the equator. 1 will bake an additionnal sample on each side of the equator, and so on.&lt;br /&gt;
&lt;br /&gt;
The higher the better for smooth vertical rotation, at a cost of higher POV number thus lower resolution/POV in the atlas. &lt;br /&gt;
&lt;br /&gt;
==== Latitude Offset ====&lt;br /&gt;
UV Sphere only. Shifts the equator sample. Useful for partial spheres.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Step ====&lt;br /&gt;
UV Sphere only. Holds angular offset between two latitudinal samples. A small value will increase smoothness of vertical rotation, but may limit the global latitudinal range.  &lt;br /&gt;
&lt;br /&gt;
==== Density ====&lt;br /&gt;
Pseudo-Fibonacci sphere only. Controls the density of the sphere. The higher the better for smooth rotations in any direction, at a cost of higher POV number thus lower resolution/POV in the atlas.&lt;br /&gt;
&lt;br /&gt;
==== Lighting Method ====&lt;br /&gt;
&lt;br /&gt;
# '''Surface Estimation:''' Computes dedicated normal and metallic map atlases to get physically correct light reflections on the impostor. The recommended method. The baked impostor will use a lit surface shader.&lt;br /&gt;
# '''Use Scene Sun Source:''' Adds the sun source of the opened scene in the baking context. Can provide better results on single lit scenes, especially with intricate smoothness/occlusion materials. The baked impostor will use an unlit shader.&lt;br /&gt;
&lt;br /&gt;
==== Presets ====&lt;br /&gt;
You can add/load presets easily with the dedicated buttons. Gives an additional degree of freedom to match your workflow. A few relevant presets are already included such as 1-POV-billboard or different hemispheres.&lt;br /&gt;
&lt;br /&gt;
=== Information ===&lt;br /&gt;
The whole information foldout is readonly. It provides useful visual feedback to help tweaking the previous category fields.&lt;br /&gt;
&lt;br /&gt;
[[File:Image 2024-02-06 180549368.png|center|thumb|426x426px]]&lt;br /&gt;
On the left column, some metrics are displayed. The values will appear in green is considered valid, orange when considered too low/high. Please note that these colors are purely informative and won't inhibit the impostor generation. &lt;br /&gt;
&lt;br /&gt;
* The total number of POV.  &lt;br /&gt;
** For UV Sphere Baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = S_{Long}*S_{Lat}&amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
** For Pseudo-Fibonacci Sphere baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = \sum_{l=-S_{Lat}/2}^{S_{Lat}/2}cos(\frac{2\pi.l}{S_{Lat}}).S_{Long} &amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The Atlas POV size. 15x15 means there are 15 POVs per line and per column.&lt;br /&gt;
* Single POV resolution&lt;br /&gt;
* The atlas coverage : if &amp;lt;math&amp;gt;\sqrt{N_{POV}}&amp;lt;/math&amp;gt; is an integer, the coverage will be 100% otherwise there will be blank slots in the atlas. 100% is better but not necessary.&lt;br /&gt;
* Unused memory : The estimated memory held by the blank slots in the grid. Will be 0 if the coverage is 100% &lt;br /&gt;
&lt;br /&gt;
On the right area stand 3 tabs for more visual information.&lt;br /&gt;
&lt;br /&gt;
* POVs : Visualize the Longitude / Latitude coverage. A great helper when tweaking the Quality Settings. You can orbit around with the mouse to see clearer.&lt;br /&gt;
* Layout : Visualize the Atlas  layout. Filled atlas slots will be green, blank will be red.&lt;br /&gt;
* Preview :  Visualize how pixelated your each single POV will be. Displays the actual objects entered in the Target foldout. You can orbit around with the mouse as well. &amp;lt;!-- Please note the snappiness/bluriness won't be previewed here. The area only shows your inputs layout in the impostor and the pixelization but does not stand for a contractual appearance of the ouput impostor. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LODGroup Settings ===&lt;br /&gt;
This category is not crucial since you can always modify it afterwards, but it can make you save a lot a time. If you just want to bake the impostor to a prefab without adding it to the scene, you can untick the field Automatic Setup.&lt;br /&gt;
[[File:Image 2024-02-06 183403606.png|center|thumb|394x394px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 4 possible scenarios for this area. &lt;br /&gt;
&lt;br /&gt;
* None of the input meshes are part of a LODGroup : A LODGroup will be added on the common ancestor. all the source renderers will be added in LOD0 and the impostor will be added in LOD1 following the given settings. A cross fading is added for smooth transitions.&lt;br /&gt;
* There is already a LODGroup but no impostors : The impostor will be added in an additional LOD level following the given parameters. Note that all the source renderers MUST belong to either no LOD or the same LOD level from the same LODGroup to avoid nested LODGroup errors.&lt;br /&gt;
* There is already a LODGroup with an impostor : The impostor will be replaced using the same relative height transition. Note that impostors are detected thanks to the ImpostorReference script attached to the LODGroup. If you want to have several impostors in the same LODGroup, just delete safely the ImpostorReference component before baking. Also, the previous impostor's prefab will not be deleted, only the instance in the scene will be replaced.&lt;br /&gt;
* There isn't any common ancestor for the input objects. Baking won't be possible.&lt;br /&gt;
&lt;br /&gt;
== Save Path ==&lt;br /&gt;
Impostors are saved as packed prefabs, embedding the quad mesh, the atlas(es) and the material. You can customize this path in this section.&lt;br /&gt;
[[File:Image 2024-02-06 184910768.png|center|thumb|401x401px]]&lt;br /&gt;
You can either type the path relative to the Assets folder or use the file browser with the dedicated button.&lt;br /&gt;
&lt;br /&gt;
The label underneath the text field hold the actual, unique path that will be used for the impostor. &lt;br /&gt;
&lt;br /&gt;
If the path contains one or more non-existing directories, they will be created automatically at baking time.&lt;br /&gt;
&lt;br /&gt;
Note that no file nor directory is created before baking. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Post-baking adjustments ==&lt;br /&gt;
Both the Lit and Unlit impostor materials have a custom Shader GUI where you can perform advanced post-baking adjustments.&lt;br /&gt;
[[File:Image 2024-02-06 190047781.png|center|thumb|865x865px]]&lt;br /&gt;
&lt;br /&gt;
=== Billboarding ===&lt;br /&gt;
The billboarding effect consists in making the quad face the camera at any time. This is performed in the vertex shader stage. &lt;br /&gt;
&lt;br /&gt;
* You can disable it with the dedicated toggle.&lt;br /&gt;
* Clamp Latitude will stop the vertical billboard effect if the view angle gets out of the latitudinal range. The horizontal billboarding will remain.&lt;br /&gt;
* Z Offset can get the a impostor closer from the camera. Really useful to get the most out of the LODGroup's crossfading effect, or to adapt the size at closer range without altering longer ranges.&lt;br /&gt;
&lt;br /&gt;
=== Surface ===&lt;br /&gt;
Due to the lack of smoothness, metallic and occlusion maps, it is sometimes required to tweak some surface parameters to match the source objects better.&lt;br /&gt;
* The Brightness slider can increase/decrease the albedo power.&lt;br /&gt;
* The Saturation slider can increase/decrease the color saturation.&lt;br /&gt;
* The Smoothness and Occlusion sliders work the same way than the default diffuse material. &lt;br /&gt;
* The Metallic slider is multiplied with the computed metallic map.&lt;br /&gt;
* The Curvature Occlusion slider applies an additionnal occlusion in rifts, and sharp angles, to estimate self-shades. Can create a gray outline on some objects.&lt;br /&gt;
&lt;br /&gt;
=== Contours ===&lt;br /&gt;
Impostors use opaque materials. To get the contours right we use alpha clipping to discard pixels that are not representing the object on each POV. The contours are usually fine out-of-the-box, but sometimes it is required to adjust a few settings.&lt;br /&gt;
* The Cutout slider can increase/decrease the sharpness of the alpha clipping geometry. You should not go higher than 0.5 to avoid cropping some important features.&lt;br /&gt;
&lt;br /&gt;
* The Interpolate toggle turns On/Off impostor bilinear interpolation smoothing. Interpolation removes the snapping effect, but adds blur. Note that interpolation adds shader complexity.&lt;br /&gt;
&lt;br /&gt;
* The Dithering Fade toggle turns On/Off Dithering fading on the edges of the impostor. Independant from the LODGroup crossfade effect.&lt;br /&gt;
&lt;br /&gt;
[[File:Impostor2.gif|thumb|429x429px|From left to right: The original model, interpolation enabled, interpolation disabled.|center]]&lt;br /&gt;
&lt;br /&gt;
=== Geometry ===&lt;br /&gt;
These settings are theoritically not needed but give additionnal freedom to advanced users.&lt;br /&gt;
* The Yaw/Elevation offset sliders make the object virtually rotate on the Horizontal/Vertical axis respectively. &lt;br /&gt;
&lt;br /&gt;
=== Advanced Options ===&lt;br /&gt;
You can control the Render Queue, Double sided Global Illumation and GPU instancing, like the default surface shader. &lt;br /&gt;
&lt;br /&gt;
== Compatible objects ==&lt;br /&gt;
Mirage Impostors are compatible with any object with a MeshFilter and a MeshRenderer attached. &lt;br /&gt;
&lt;br /&gt;
Note that translations (on all axes), scaling (on all axes) and rotation (around the vertical axis only) are supported. &lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
Due to their nature, Mirage impostors have their few limitations.&lt;br /&gt;
&lt;br /&gt;
* Full rotation compatibility : as said just above, the impostors won't be rotated around X and Z axes even if their parent does. &lt;br /&gt;
* Lossy scale : Mirage uses the transforms [https://docs.unity3d.com/ScriptReference/Transform-lossyScale.html lossyScale] of the source objects. If the source objects are skewed by nested non uniform scaling a rotation, the impostor may be a appear close from but source but unskewed.&lt;br /&gt;
* Shadows : Mirage impostors are compatible with shadows but they are not physically correct since it only projects the alpha clipped quad instead of having a dedicated shadow pass. It means shadow will be correct if the light comes from the front or the back but not the sides of the impostor. This is a simplicity choice, since correct shadow would add a GPU-intensive shader pass and shadows are usually not even visible from the impostor nominal distance. Moreover, it keeps Mirage natively pipeline independant since shader graph is not designed to add custom passes.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Didn't find what you were searching for?&lt;br /&gt;
&lt;br /&gt;
Feel free to contact me by email or on my discord channel.&lt;br /&gt;
&lt;br /&gt;
[mailto:support@leochaumartin.com support@leochaumartin.com]&lt;br /&gt;
&lt;br /&gt;
https://discord.gg/kYwzdvAt8q&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://www.gamedeveloper.com/programming/dynamic-2d-imposters-a-simple-efficient-directx-9-implementation&lt;br /&gt;
&lt;br /&gt;
https://calcifer.org/kenneth-christiansen/ComputerScience/imposters.pdf&lt;br /&gt;
&lt;br /&gt;
https://developer.nvidia.com/gpugems/gpugems3/part-iv-image-effects/chapter-21-true-impostors&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=157</id>
		<title>Mirage</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=157"/>
		<updated>2024-02-12T22:32:34Z</updated>

		<summary type="html">&lt;p&gt;Lch: /* How to bake an impostor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Setup ==&lt;br /&gt;
The whole package is contained in the Mirage folder resulting from the import but you can move it wherever you want.&lt;br /&gt;
&lt;br /&gt;
== What is an impostor ==&lt;br /&gt;
An impostor or imposter is a dynamically rendered billboard texture map used to stand in for geometry in the distance. &lt;br /&gt;
&lt;br /&gt;
In Mirage context, you can have as many objects as you want in a single impostor, and all the the points of view are stored into an abedo map and an optional normal map atlas map per impostor. Smoothness, metallic or occlusion are not baked into textures but are still customizable on post baking options.&lt;br /&gt;
== How to bake your first impostor ==&lt;br /&gt;
&amp;lt;code&amp;gt;Mirage&amp;lt;/code&amp;gt; consists in a single editor window. You can open it via &amp;lt;code&amp;gt;Window-&amp;gt;Mirage-&amp;gt;Impostors&amp;lt;/code&amp;gt;. For a simple one-click impostor approach, drag and drop the common ancestor of all the objects you want to bake into target area and click on the Generate Impostor button. &lt;br /&gt;
&lt;br /&gt;
You can also customize a lot of settings for a more advanced usage. There are 5 category foldouts that that can expand or hide by clicking on their title. Even when hidden, they still provide basic information or controls on the right of the title. &lt;br /&gt;
&lt;br /&gt;
The following sections will provide detailed explaination of each of the categories.[[File:Image 2024-02-06 164734156.png|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
=== Setup the target(s) ===&lt;br /&gt;
This category holds all the source object(s) information. Note that only one impostor can be baked at a time, so all the target will all be part of the same impostor. &lt;br /&gt;
For a simple one-click impostor approach, drag and drop the common ancestor in the dedicated field. Note that if you want to bake only one object the common ancestor can be the object itself or its parent. When the common ancestor is set, Mirage will automatically detect all the mesh filters in its children, recursively. You can check which mesh filters are included by expanding the section as following. Null or invalid objects will be ignored. &lt;br /&gt;
[[File:Image 2024-02-06 170842562.png|center|thumb|357x357px]]&lt;br /&gt;
You can also exclude some meshes or add some manually by dropping them into the area. If you change the mesh filters manually, the common ancestor will be updated accordingly. Note that '''a common ancestor is needed to bake an impostor'''. &lt;br /&gt;
&lt;br /&gt;
=== Quality Settings ===&lt;br /&gt;
This category is crucial and will have a direct impact on the visual quality of the impostor. Provides full control over the baking topology. This section should be paired with the Information category that provides real-time visualization for an excellent and fast control over the baking topology.&lt;br /&gt;
[[File:Image 2024-02-06 172158522.png|center|thumb|483x483px]]&lt;br /&gt;
&lt;br /&gt;
==== Texture Size ====&lt;br /&gt;
As previously mentionned, Color Maps and Normal Maps are stored into square POT atlases. This field controls the resolution of these atlases, from 128x128 to 4096x4096. The Estimated Size label provides the size of the whole impostor prefab after baking (with DXT compression) &lt;br /&gt;
&lt;br /&gt;
==== Sphere Type ====&lt;br /&gt;
&lt;br /&gt;
*'''UV sphere''': The default choice.  The UV sphere is based on a fixed number of longitude and latitude samples.  The coverage is denser at the poles.The UV Sphere is a solid choice in many use cases, with more versatility regarding partial sphere baking.&lt;br /&gt;
*'''Pseudo-Fibonacci sphere''': at an experimental stage.  Provides a homogeneous coverage. Not compatible with latitude interpolation in the impostor shader. Despite being homogeneous, the output impostor will look smooth near the equator, with more noticeable snaps or blur around the poles. Full sphere baking only.&lt;br /&gt;
&lt;br /&gt;
==== Longitude Samples ====&lt;br /&gt;
UV Sphere only. Holds the number of longitudinal samples. The higher the better for smooth horizontal rotation, at a cost of higher POV number thus resolution/POV in the atlas. All samples are equally spread around the 360 degrees.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Samples ====&lt;br /&gt;
UV Sphere only. Holds half of the number of latitudinal samples (equator excluded). This means that a 0 value will just bake around the equator. 1 will bake an additionnal sample on each side of the equator, and so on.&lt;br /&gt;
&lt;br /&gt;
The higher the better for smooth vertical rotation, at a cost of higher POV number thus resolution/POV in the atlas. &lt;br /&gt;
&lt;br /&gt;
==== Laatitude Offset ====&lt;br /&gt;
UV Sphere only. Shifts the equator sample. Useful for partial spheres.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Step ====&lt;br /&gt;
UV Sphere only. Holds angular offset between two latitudinal samples. A small value will increase smoothness of vertical rotation, but may limit the global latitudinal range.  &lt;br /&gt;
&lt;br /&gt;
==== Density ====&lt;br /&gt;
Pseudo-Fibonacci sphere only. Controls the density of the sphere. The higher the better for smooth rotations in any direction, at a cost of higher POV number thus resolution/POV in the atlas.&lt;br /&gt;
&lt;br /&gt;
==== Lighting Method ====&lt;br /&gt;
&lt;br /&gt;
# '''Normal Estimation'''Computes a dedicated normal map atlas to get physically correct light reflections on the impostor. The recommended method. The baked impostor will use a lit surface shader.&lt;br /&gt;
# '''Use Scene Sun Source'''Adds the sun source of the opened scene in the baking context. Can provide better results on single lit scenes, especially with intricate metallic/smoothness/self shading objects. The baked impostor will use an unlit shader.&lt;br /&gt;
&lt;br /&gt;
==== Presets ====&lt;br /&gt;
You can add/load presets easily with the dedicated buttons. Gives an additional degree of freedom to match your workflow. A few relevant presets are already included such as 1-POV-billboard or different hemispheres.&lt;br /&gt;
&lt;br /&gt;
=== Information ===&lt;br /&gt;
The whole information foldout is readonly. and provides useful visual feedback to help tweaking the previous category fileds.&lt;br /&gt;
&lt;br /&gt;
[[File:Image 2024-02-06 180549368.png|center|thumb|426x426px]]&lt;br /&gt;
On the left column, some metrics are displayed. The values will appear in green is considered valid, orange when considered too low/high. Please note that these colors are purely informative and won't inhibit the impostor generation. &lt;br /&gt;
&lt;br /&gt;
* The total number of POV.  &lt;br /&gt;
** For UV Sphere Baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = S_{Long}*S_{Lat}&amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
** For Pseudo-Fibonacci Sphere baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = \sum_{l=-S_{Lat}/2}^{S_{Lat}/2}cos(\frac{2\pi.l}{S_{Lat}}).S_{Long} &amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The Atlas POV size. 15x15 means there are 15 POVs per line and per column.&lt;br /&gt;
* Single POV resolution&lt;br /&gt;
* The atlas coverage : if &amp;lt;math&amp;gt;\sqrt{N_{POV}}&amp;lt;/math&amp;gt; is an integer, the coverage will be 100% otherwise there will be blank slots in the atlas. 100% is better but not necessary.&lt;br /&gt;
* Unused memory : The estimated memory held by the blank slots in the grid. Will be 0 if the coverage is 100% &lt;br /&gt;
&lt;br /&gt;
On the right area stand 3 tabs for more visual information.&lt;br /&gt;
&lt;br /&gt;
* POVs : Visualize the Longitude / Latitude coverage. A great helper when tweaking the Quality Settings. You can orbit around with the mouse to see clearer.&lt;br /&gt;
* Layout : Visualize the Atlas  layout. Filled atlas slots will be green, blank will be red.&lt;br /&gt;
* Preview :  Visualize how pixelated your each single POV will be. Displays the actual objects entered in the Target foldout. You can orbit around with the mouse as well. Please note the snappiness/bluriness won't be previewed here. The area only shows your inputs layout in the impostor and the pixelization but does not stand for a contractual appearance of the ouput impostor.&lt;br /&gt;
&lt;br /&gt;
=== LODGroup Settings ===&lt;br /&gt;
This category is not crucial since you can always modify it afterwards, but it can make you save a lot a time. If you just want to bake the impostor to a prefab without adding it to the scene, you can untick the field Automatic Setup.&lt;br /&gt;
[[File:Image 2024-02-06 183403606.png|center|thumb|394x394px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 4 possible scenarios for this area. &lt;br /&gt;
&lt;br /&gt;
* None of the input meshes are part of a LODGroup : A LODGroup will be added on the common ancestor. all the source renderers will be added in LOD0 and the impostor will be added in LOD1 following the given settings. A cross fading is added for smooth transitions.&lt;br /&gt;
* There is already a LODGroup but no impostors : The impostor will be added in an additional LOD level following the given parameters. Note that all the source renderers MUST belong to either no LOD or the same LOD level from the same LODGroup to avoid nested LODGroup errors.&lt;br /&gt;
* There is already a LODGroup with an impostor : The impostor will be replaced using the same relative height transition. Note that impostors are detected thanks to the ImpostorReference script attached to the LODGroup. If you want to have several impostors in the same LODGroup, just delete safely the ImpostorReference component before baking. Also, the previous impostor's prefab will not be deleted, only the instance in the scene will be replaced.&lt;br /&gt;
* There isn't any common ancestor for the input objects. Baking won't be possible.&lt;br /&gt;
&lt;br /&gt;
== Save Path ==&lt;br /&gt;
Impostors are saved as packed prefabs, embedding the quad mesh, the atlas(es) and the material. You can customize this path in this section.&lt;br /&gt;
[[File:Image 2024-02-06 184910768.png|center|thumb|401x401px]]&lt;br /&gt;
You can either type the path relative to the Assets folder or use the file browser with the dedicated button.&lt;br /&gt;
&lt;br /&gt;
The label underneath the text field hold the actual, unique path that will be used for the impostor. &lt;br /&gt;
&lt;br /&gt;
If the path contains one or more non-existing directories, they will be created automatically at baking time.&lt;br /&gt;
&lt;br /&gt;
Note that no file nor directory is created before baking. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Post-baking adjustments ==&lt;br /&gt;
Both the Lit and Unlit impostor materials have a custom Shader GUI where you can perform advanced post-baking adjustments.&lt;br /&gt;
[[File:Image 2024-02-06 190047781.png|center|thumb|865x865px]]&lt;br /&gt;
&lt;br /&gt;
=== Billboarding ===&lt;br /&gt;
The billboarding effect consists in making the quad face the camera at any time. This is performed in the vertex shader stage. &lt;br /&gt;
&lt;br /&gt;
* You can disable it with the dedicated toggle.&lt;br /&gt;
* Clamp Latitude will stop the vertical billboard effect if the view angle gets out of the latitudinal range. The horizontal billboarding will remain.&lt;br /&gt;
* Z Offset can get the a impostor closer from the camera. Really useful to get the most out of the LODGroup's crossfading effect, or to adapt the size at closer range without altering longer ranges.&lt;br /&gt;
&lt;br /&gt;
=== Surface ===&lt;br /&gt;
Due to the lack of smoothness, metallic and occlusion maps, it is sometimes required to tweak some surface parameters to match the source objects better.&lt;br /&gt;
* The Brightness slider can increase/decrease the albedo power.&lt;br /&gt;
* The Saturation slider can increase/decrease the color saturation.&lt;br /&gt;
* The Smoothness/Metallic/Occlusion sliders work the same way than the default diffuse material.&lt;br /&gt;
* The Curvature Occlusion slider applies an additionnal occlusion in rifts, and sharp angles, to estimate self-shades.&lt;br /&gt;
&lt;br /&gt;
=== Contours ===&lt;br /&gt;
Impostors use opaque materials. To get the contours right we use alpha clipping to discard pixels that are not representing the object on each POV. The contours are usually fine out-of-the-box, but sometimes it is required to adjust a few settings.&lt;br /&gt;
* The Cutout slider can increase/decrease the sharpness of the alpha clipping geometry. You should not go higher than 0.5 to avoid cropping some important features.&lt;br /&gt;
&lt;br /&gt;
* The Interpolate toggle turns On/Off impostor bilinear interpolation smoothing. Interpolation removes the snapping effect, but adds blur. Note that interpolation adds shader complexity.&lt;br /&gt;
&lt;br /&gt;
* The Dithering Fade toggle turns On/Off Dithering fading on the edges of the impostor. Independant from the LODGroup crossfade effect.&lt;br /&gt;
&lt;br /&gt;
[[File:Impostor2.gif|thumb|429x429px|From left to right: The original model, interpolation enabled, interpolation disabled.|center]]&lt;br /&gt;
&lt;br /&gt;
=== Geometry ===&lt;br /&gt;
These settings are theoritically not needed but are a way of giving additionnal freedom to advanced users.&lt;br /&gt;
* The Yaw/Elevation offset sliders make the object virtually rotate on the Horizontal/Vertical axis respectively. &lt;br /&gt;
&lt;br /&gt;
=== Advanced Options ===&lt;br /&gt;
You can control the Render Queue, Double sided Global Illumation and GPU instancing, like the default surface shader. &lt;br /&gt;
&lt;br /&gt;
== Compatible objects ==&lt;br /&gt;
Mirage Impostors are compatible with any object with a MeshFilter and a MeshRenderer attached. &lt;br /&gt;
&lt;br /&gt;
Note that translations (on all axes), scaling (on all axes) and rotation (around the vertical axis only) are supported. &lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
Due to their nature, Mirage impostors have their few limitations.&lt;br /&gt;
&lt;br /&gt;
* Full rotation compatibility : as said just above, the impostors won't be rotated around X and Z axes even if their parent does. &lt;br /&gt;
* Lossy scale : Mirage uses the transforms [https://docs.unity3d.com/ScriptReference/Transform-lossyScale.html lossyScale] of the source objects. If the source objects are skewed by nested non uniform scaling a rotation, the impostor may be a appear close from but source but unskewed.&lt;br /&gt;
* Shadows : Mirage impostors are compatible with shadows but they are not physically correct since it only projects the alpha clipped quad instead of having a dedicated shadow pass. It means shadow will be correct if the light comes from the front or the back but not the sides of the impostor. This is a simplicity choice, since correct shadow would add a GPU-intensive shader pass and shadows are usually not even visible from the impostor nominal distance. Moreover, it keeps Mirage natively pipeline independant since shader graph is not designed to add this kind of advanced features.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Didn't find what you were searching for?&lt;br /&gt;
&lt;br /&gt;
Feel free to contact me by email or on my discord channel.&lt;br /&gt;
&lt;br /&gt;
[mailto:support@leochaumartin.com support@leochaumartin.com]&lt;br /&gt;
&lt;br /&gt;
https://discord.gg/kYwzdvAt8q&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://www.gamedeveloper.com/programming/dynamic-2d-imposters-a-simple-efficient-directx-9-implementation&lt;br /&gt;
&lt;br /&gt;
https://calcifer.org/kenneth-christiansen/ComputerScience/imposters.pdf&lt;br /&gt;
&lt;br /&gt;
https://developer.nvidia.com/gpugems/gpugems3/part-iv-image-effects/chapter-21-true-impostors&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=156</id>
		<title>Mirage</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=156"/>
		<updated>2024-02-12T22:31:49Z</updated>

		<summary type="html">&lt;p&gt;Lch: /* Information */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Setup ==&lt;br /&gt;
The whole package is contained in the Mirage folder resulting from the import but you can move it wherever you want.&lt;br /&gt;
&lt;br /&gt;
== What is an impostor ==&lt;br /&gt;
An impostor or imposter is a dynamically rendered billboard texture map used to stand in for geometry in the distance. &lt;br /&gt;
&lt;br /&gt;
In Mirage context, you can have as many objects as you want in a single impostor, and all the the points of view are stored into an abedo map and an optional normal map atlas map per impostor. Smoothness, metallic or occlusion are not baked into textures but are still customizable on post baking options.&lt;br /&gt;
== How to bake an impostor ==&lt;br /&gt;
&amp;lt;code&amp;gt;Mirage&amp;lt;/code&amp;gt; consists in a single editor window. You can open it via &amp;lt;code&amp;gt;Window-&amp;gt;Mirage-&amp;gt;Impostors&amp;lt;/code&amp;gt;. For a simple one-click impostor approach, drag and drop the common ancestor of all the objects you want to bake into target area and click on the Generate Impostor button. &lt;br /&gt;
&lt;br /&gt;
You can also customize a lot of settings for a more advanced usage. There are 5 category foldouts that that can expand or hide by clicking on their title. Even when hidden, they still provide basic information or controls on the right of the title. &lt;br /&gt;
&lt;br /&gt;
The following sections will provide detailed explaination of each of the categories.[[File:Image 2024-02-06 164734156.png|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
=== Setup the target(s) ===&lt;br /&gt;
This category holds all the source object(s) information. Note that only one impostor can be baked at a time, so all the target will all be part of the same impostor. &lt;br /&gt;
For a simple one-click impostor approach, drag and drop the common ancestor in the dedicated field. Note that if you want to bake only one object the common ancestor can be the object itself or its parent. When the common ancestor is set, Mirage will automatically detect all the mesh filters in its children, recursively. You can check which mesh filters are included by expanding the section as following. Null or invalid objects will be ignored. &lt;br /&gt;
[[File:Image 2024-02-06 170842562.png|center|thumb|357x357px]]&lt;br /&gt;
You can also exclude some meshes or add some manually by dropping them into the area. If you change the mesh filters manually, the common ancestor will be updated accordingly. Note that '''a common ancestor is needed to bake an impostor'''. &lt;br /&gt;
&lt;br /&gt;
=== Quality Settings ===&lt;br /&gt;
This category is crucial and will have a direct impact on the visual quality of the impostor. Provides full control over the baking topology. This section should be paired with the Information category that provides real-time visualization for an excellent and fast control over the baking topology.&lt;br /&gt;
[[File:Image 2024-02-06 172158522.png|center|thumb|483x483px]]&lt;br /&gt;
&lt;br /&gt;
==== Texture Size ====&lt;br /&gt;
As previously mentionned, Color Maps and Normal Maps are stored into square POT atlases. This field controls the resolution of these atlases, from 128x128 to 4096x4096. The Estimated Size label provides the size of the whole impostor prefab after baking (with DXT compression) &lt;br /&gt;
&lt;br /&gt;
==== Sphere Type ====&lt;br /&gt;
&lt;br /&gt;
*'''UV sphere''': The default choice.  The UV sphere is based on a fixed number of longitude and latitude samples.  The coverage is denser at the poles.The UV Sphere is a solid choice in many use cases, with more versatility regarding partial sphere baking.&lt;br /&gt;
*'''Pseudo-Fibonacci sphere''': at an experimental stage.  Provides a homogeneous coverage. Not compatible with latitude interpolation in the impostor shader. Despite being homogeneous, the output impostor will look smooth near the equator, with more noticeable snaps or blur around the poles. Full sphere baking only.&lt;br /&gt;
&lt;br /&gt;
==== Longitude Samples ====&lt;br /&gt;
UV Sphere only. Holds the number of longitudinal samples. The higher the better for smooth horizontal rotation, at a cost of higher POV number thus resolution/POV in the atlas. All samples are equally spread around the 360 degrees.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Samples ====&lt;br /&gt;
UV Sphere only. Holds half of the number of latitudinal samples (equator excluded). This means that a 0 value will just bake around the equator. 1 will bake an additionnal sample on each side of the equator, and so on.&lt;br /&gt;
&lt;br /&gt;
The higher the better for smooth vertical rotation, at a cost of higher POV number thus resolution/POV in the atlas. &lt;br /&gt;
&lt;br /&gt;
==== Laatitude Offset ====&lt;br /&gt;
UV Sphere only. Shifts the equator sample. Useful for partial spheres.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Step ====&lt;br /&gt;
UV Sphere only. Holds angular offset between two latitudinal samples. A small value will increase smoothness of vertical rotation, but may limit the global latitudinal range.  &lt;br /&gt;
&lt;br /&gt;
==== Density ====&lt;br /&gt;
Pseudo-Fibonacci sphere only. Controls the density of the sphere. The higher the better for smooth rotations in any direction, at a cost of higher POV number thus resolution/POV in the atlas.&lt;br /&gt;
&lt;br /&gt;
==== Lighting Method ====&lt;br /&gt;
&lt;br /&gt;
# '''Normal Estimation'''Computes a dedicated normal map atlas to get physically correct light reflections on the impostor. The recommended method. The baked impostor will use a lit surface shader.&lt;br /&gt;
# '''Use Scene Sun Source'''Adds the sun source of the opened scene in the baking context. Can provide better results on single lit scenes, especially with intricate metallic/smoothness/self shading objects. The baked impostor will use an unlit shader.&lt;br /&gt;
&lt;br /&gt;
==== Presets ====&lt;br /&gt;
You can add/load presets easily with the dedicated buttons. Gives an additional degree of freedom to match your workflow. A few relevant presets are already included such as 1-POV-billboard or different hemispheres.&lt;br /&gt;
&lt;br /&gt;
=== Information ===&lt;br /&gt;
The whole information foldout is readonly. and provides useful visual feedback to help tweaking the previous category fileds.&lt;br /&gt;
&lt;br /&gt;
[[File:Image 2024-02-06 180549368.png|center|thumb|426x426px]]&lt;br /&gt;
On the left column, some metrics are displayed. The values will appear in green is considered valid, orange when considered too low/high. Please note that these colors are purely informative and won't inhibit the impostor generation. &lt;br /&gt;
&lt;br /&gt;
* The total number of POV.  &lt;br /&gt;
** For UV Sphere Baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = S_{Long}*S_{Lat}&amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt; &lt;br /&gt;
** For Pseudo-Fibonacci Sphere baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = \sum_{l=-S_{Lat}/2}^{S_{Lat}/2}cos(\frac{2\pi.l}{S_{Lat}}).S_{Long} &amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The Atlas POV size. 15x15 means there are 15 POVs per line and per column.&lt;br /&gt;
* Single POV resolution&lt;br /&gt;
* The atlas coverage : if &amp;lt;math&amp;gt;\sqrt{N_{POV}}&amp;lt;/math&amp;gt; is an integer, the coverage will be 100% otherwise there will be blank slots in the atlas. 100% is better but not necessary.&lt;br /&gt;
* Unused memory : The estimated memory held by the blank slots in the grid. Will be 0 if the coverage is 100% &lt;br /&gt;
&lt;br /&gt;
On the right area stand 3 tabs for more visual information.&lt;br /&gt;
&lt;br /&gt;
* POVs : Visualize the Longitude / Latitude coverage. A great helper when tweaking the Quality Settings. You can orbit around with the mouse to see clearer.&lt;br /&gt;
* Layout : Visualize the Atlas  layout. Filled atlas slots will be green, blank will be red.&lt;br /&gt;
* Preview :  Visualize how pixelated your each single POV will be. Displays the actual objects entered in the Target foldout. You can orbit around with the mouse as well. Please note the snappiness/bluriness won't be previewed here. The area only shows your inputs layout in the impostor and the pixelization but does not stand for a contractual appearance of the ouput impostor.&lt;br /&gt;
&lt;br /&gt;
=== LODGroup Settings ===&lt;br /&gt;
This category is not crucial since you can always modify it afterwards, but it can make you save a lot a time. If you just want to bake the impostor to a prefab without adding it to the scene, you can untick the field Automatic Setup.&lt;br /&gt;
[[File:Image 2024-02-06 183403606.png|center|thumb|394x394px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 4 possible scenarios for this area. &lt;br /&gt;
&lt;br /&gt;
* None of the input meshes are part of a LODGroup : A LODGroup will be added on the common ancestor. all the source renderers will be added in LOD0 and the impostor will be added in LOD1 following the given settings. A cross fading is added for smooth transitions.&lt;br /&gt;
* There is already a LODGroup but no impostors : The impostor will be added in an additional LOD level following the given parameters. Note that all the source renderers MUST belong to either no LOD or the same LOD level from the same LODGroup to avoid nested LODGroup errors.&lt;br /&gt;
* There is already a LODGroup with an impostor : The impostor will be replaced using the same relative height transition. Note that impostors are detected thanks to the ImpostorReference script attached to the LODGroup. If you want to have several impostors in the same LODGroup, just delete safely the ImpostorReference component before baking. Also, the previous impostor's prefab will not be deleted, only the instance in the scene will be replaced.&lt;br /&gt;
* There isn't any common ancestor for the input objects. Baking won't be possible.&lt;br /&gt;
&lt;br /&gt;
== Save Path ==&lt;br /&gt;
Impostors are saved as packed prefabs, embedding the quad mesh, the atlas(es) and the material. You can customize this path in this section.&lt;br /&gt;
[[File:Image 2024-02-06 184910768.png|center|thumb|401x401px]]&lt;br /&gt;
You can either type the path relative to the Assets folder or use the file browser with the dedicated button.&lt;br /&gt;
&lt;br /&gt;
The label underneath the text field hold the actual, unique path that will be used for the impostor. &lt;br /&gt;
&lt;br /&gt;
If the path contains one or more non-existing directories, they will be created automatically at baking time.&lt;br /&gt;
&lt;br /&gt;
Note that no file nor directory is created before baking. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Post-baking adjustments ==&lt;br /&gt;
Both the Lit and Unlit impostor materials have a custom Shader GUI where you can perform advanced post-baking adjustments.&lt;br /&gt;
[[File:Image 2024-02-06 190047781.png|center|thumb|865x865px]]&lt;br /&gt;
&lt;br /&gt;
=== Billboarding ===&lt;br /&gt;
The billboarding effect consists in making the quad face the camera at any time. This is performed in the vertex shader stage. &lt;br /&gt;
&lt;br /&gt;
* You can disable it with the dedicated toggle.&lt;br /&gt;
* Clamp Latitude will stop the vertical billboard effect if the view angle gets out of the latitudinal range. The horizontal billboarding will remain.&lt;br /&gt;
* Z Offset can get the a impostor closer from the camera. Really useful to get the most out of the LODGroup's crossfading effect, or to adapt the size at closer range without altering longer ranges.&lt;br /&gt;
&lt;br /&gt;
=== Surface ===&lt;br /&gt;
Due to the lack of smoothness, metallic and occlusion maps, it is sometimes required to tweak some surface parameters to match the source objects better.&lt;br /&gt;
* The Brightness slider can increase/decrease the albedo power.&lt;br /&gt;
* The Saturation slider can increase/decrease the color saturation.&lt;br /&gt;
* The Smoothness/Metallic/Occlusion sliders work the same way than the default diffuse material.&lt;br /&gt;
* The Curvature Occlusion slider applies an additionnal occlusion in rifts, and sharp angles, to estimate self-shades.&lt;br /&gt;
&lt;br /&gt;
=== Contours ===&lt;br /&gt;
Impostors use opaque materials. To get the contours right we use alpha clipping to discard pixels that are not representing the object on each POV. The contours are usually fine out-of-the-box, but sometimes it is required to adjust a few settings.&lt;br /&gt;
* The Cutout slider can increase/decrease the sharpness of the alpha clipping geometry. You should not go higher than 0.5 to avoid cropping some important features.&lt;br /&gt;
&lt;br /&gt;
* The Interpolate toggle turns On/Off impostor bilinear interpolation smoothing. Interpolation removes the snapping effect, but adds blur. Note that interpolation adds shader complexity.&lt;br /&gt;
&lt;br /&gt;
* The Dithering Fade toggle turns On/Off Dithering fading on the edges of the impostor. Independant from the LODGroup crossfade effect.&lt;br /&gt;
&lt;br /&gt;
[[File:Impostor2.gif|thumb|429x429px|From left to right: The original model, interpolation enabled, interpolation disabled.|center]]&lt;br /&gt;
&lt;br /&gt;
=== Geometry ===&lt;br /&gt;
These settings are theoritically not needed but are a way of giving additionnal freedom to advanced users.&lt;br /&gt;
* The Yaw/Elevation offset sliders make the object virtually rotate on the Horizontal/Vertical axis respectively. &lt;br /&gt;
&lt;br /&gt;
=== Advanced Options ===&lt;br /&gt;
You can control the Render Queue, Double sided Global Illumation and GPU instancing, like the default surface shader. &lt;br /&gt;
&lt;br /&gt;
== Compatible objects ==&lt;br /&gt;
Mirage Impostors are compatible with any object with a MeshFilter and a MeshRenderer attached. &lt;br /&gt;
&lt;br /&gt;
Note that translations (on all axes), scaling (on all axes) and rotation (around the vertical axis only) are supported. &lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
Due to their nature, Mirage impostors have their few limitations.&lt;br /&gt;
&lt;br /&gt;
* Full rotation compatibility : as said just above, the impostors won't be rotated around X and Z axes even if their parent does. &lt;br /&gt;
* Lossy scale : Mirage uses the transforms [https://docs.unity3d.com/ScriptReference/Transform-lossyScale.html lossyScale] of the source objects. If the source objects are skewed by nested non uniform scaling a rotation, the impostor may be a appear close from but source but unskewed.&lt;br /&gt;
* Shadows : Mirage impostors are compatible with shadows but they are not physically correct since it only projects the alpha clipped quad instead of having a dedicated shadow pass. It means shadow will be correct if the light comes from the front or the back but not the sides of the impostor. This is a simplicity choice, since correct shadow would add a GPU-intensive shader pass and shadows are usually not even visible from the impostor nominal distance. Moreover, it keeps Mirage natively pipeline independant since shader graph is not designed to add this kind of advanced features.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Didn't find what you were searching for?&lt;br /&gt;
&lt;br /&gt;
Feel free to contact me by email or on my discord channel.&lt;br /&gt;
&lt;br /&gt;
[mailto:support@leochaumartin.com support@leochaumartin.com]&lt;br /&gt;
&lt;br /&gt;
https://discord.gg/kYwzdvAt8q&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://www.gamedeveloper.com/programming/dynamic-2d-imposters-a-simple-efficient-directx-9-implementation&lt;br /&gt;
&lt;br /&gt;
https://calcifer.org/kenneth-christiansen/ComputerScience/imposters.pdf&lt;br /&gt;
&lt;br /&gt;
https://developer.nvidia.com/gpugems/gpugems3/part-iv-image-effects/chapter-21-true-impostors&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=Seamless&amp;diff=155</id>
		<title>Seamless</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=Seamless&amp;diff=155"/>
		<updated>2024-02-12T22:14:27Z</updated>

		<summary type="html">&lt;p&gt;Lch: /* Contact */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Seamless is a powerful graph builder integrated in the Unity Editor. It allows&lt;br /&gt;
&lt;br /&gt;
you to bake beautiful procedural textures from noise or geometric primitives,&lt;br /&gt;
&lt;br /&gt;
coupled with mathematical operations, image filters, etc.&lt;br /&gt;
&lt;br /&gt;
Seamless works natively with any render pipeline on any Unity version above&lt;br /&gt;
&lt;br /&gt;
2018.1.&lt;br /&gt;
[[File:SeamlessLogo.png|thumb|366x366px|The Seamless logo. Fun-fact: it was created with the tool itself]]&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
The whole package is contained in the Seamless folder resulting from the import. You can move it wherever you want, but it is recommended to keep the same folder structure.&lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
You can create a new Seamless graph from the right-click context menu in the project window.&lt;br /&gt;
&lt;br /&gt;
[[File:Seamless MAN1.png|frameless|330x330px]]&lt;br /&gt;
&lt;br /&gt;
Each graph is saved as a SeamlessObject in a &amp;lt;code&amp;gt;.asset&amp;lt;/code&amp;gt; file. You can recognize&lt;br /&gt;
&lt;br /&gt;
them with the seamless logo. You can change the texture size from the inspector.&lt;br /&gt;
&lt;br /&gt;
[[File:Seamless MAN2.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
You can open a graph by double-clicking on it. On Unity 2019.2 and above, the window will try dock itself next to the scene window, otherwise it will appear as a floating window, that you can dock manually.&lt;br /&gt;
&lt;br /&gt;
== Navigation ==&lt;br /&gt;
The navigation in the main canvas is similar to other graph editors such as Shadergraph or the animator. You can zoom in/out using scroll wheel, move by click &amp;amp; drag on the mouse scroll wheel. Nodes can be selected by clicking on it, or by drawing a selection rectangle. You can drag selected nodes to move them.&lt;br /&gt;
&lt;br /&gt;
You cannot select or interact with links : they are 100% visual. To add a link, you must click and drag from an output, links cannot be created backwards. To remove a link you must remove one of the nodes it connect, or connect another link to the same output node. There is a header on the top of each window containing information and buttons to save, save as, and reload the graph.&lt;br /&gt;
[[File:Seamless MAN3.png|border|center|frameless|725x725px]]To create a new node, just right click on the canvas and a context menu will appear. You can also start building a link and releasing the mouse left button in a free space, the same context menu will appear and the link will be associated with the first input (if there is any) of the added node.&lt;br /&gt;
[[File:Seamless MAN4.png|border|center|frameless|724x724px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Some nodes contain one or several parameters. You can change their value as a text edit or as a slider with the mouse.&lt;br /&gt;
&lt;br /&gt;
Once you are happy with a result, you can export it as a static image using an Export node. You can use as many Export nodes as you want. So far, Seamless only supports PNG export.&lt;br /&gt;
[[File:Seamless MAN5.png|border|center|frameless|561x561px]]&lt;br /&gt;
You can browse the path by clicking on the Folder icon. Make sure you select a path included in the Assets folder of your project.&lt;br /&gt;
&lt;br /&gt;
Since version 4.0, you can change the default export path via Edit-&amp;gt;Preferences-&amp;gt;Seamless.&lt;br /&gt;
&lt;br /&gt;
==Nodes list==&lt;br /&gt;
[[File:Seamless Primitive Nodes.png|thumb|770x770px|All the primitive nodes]]&lt;br /&gt;
&lt;br /&gt;
===Preview===&lt;br /&gt;
Does nothing. Displays the input as it is.&lt;br /&gt;
&lt;br /&gt;
===OneMinus===&lt;br /&gt;
Computes the negative or R, G and B. Keep Alpha untouched.&lt;br /&gt;
&lt;br /&gt;
===Add===&lt;br /&gt;
Adds A and B channel-wise. Clamps automatically between 0 and 1.&lt;br /&gt;
&lt;br /&gt;
===Subtract ===&lt;br /&gt;
Subtracts A and B channel-wise.&lt;br /&gt;
&lt;br /&gt;
===Multiply===&lt;br /&gt;
Multiplies A and B channel-wise. A multiplier float field let you ajust the result.&lt;br /&gt;
&lt;br /&gt;
===Pow===&lt;br /&gt;
Applies the mathematical power function to Input with a float exponent.&lt;br /&gt;
&lt;br /&gt;
===Divide===&lt;br /&gt;
Divides A by B channel-wise.&lt;br /&gt;
&lt;br /&gt;
===Clamp===&lt;br /&gt;
Clamps Input between Min and Max float parameters.&lt;br /&gt;
&lt;br /&gt;
===Step===&lt;br /&gt;
Binarizes the input channel-wise, using a float edge between 0 and 1.&lt;br /&gt;
&lt;br /&gt;
===Lerp (since version 2.1)===&lt;br /&gt;
Perform a linear interpolation from A to B according to T channel-wise.&lt;br /&gt;
&lt;br /&gt;
===Hash (since version 3.1)===&lt;br /&gt;
Perform a hashing of the input channel-wise. Simple way to randomize the input.&lt;br /&gt;
&lt;br /&gt;
===Gradient (since version 4.0)===&lt;br /&gt;
Interprets the Input's red channel as the time for an user defined gradient. Uses Unity's native gradient picker.&lt;br /&gt;
&lt;br /&gt;
===Blur===&lt;br /&gt;
Applies Gaussian Blur to the input, using a float radius and an integer steps number parameters.&lt;br /&gt;
&lt;br /&gt;
===EdgeDetection===&lt;br /&gt;
Performs the input’s edge detection. You can adjust the steps number in pixels.&lt;br /&gt;
&lt;br /&gt;
=== Normal===&lt;br /&gt;
Computes normal map from a given heightmap. Only the red channel of the input is considered. You can adjust the strength of the normal effect with a float parameter.&lt;br /&gt;
&lt;br /&gt;
===Barrel===&lt;br /&gt;
Applies Barrel Distortion algorithm to the input. The power is controlled by a float parameter.&lt;br /&gt;
&lt;br /&gt;
=== Spherize ===&lt;br /&gt;
Maps the input on a sphere.&lt;br /&gt;
&lt;br /&gt;
===Curvature===&lt;br /&gt;
Computes the curvature of the input. Useful for ambient occlusion estimation.&lt;br /&gt;
&lt;br /&gt;
=== Luminance (since version 3.1)===&lt;br /&gt;
Computes the grayscale luminance of the colored input. Dot product of (R,G,B) with (0.299, 0.587, 0.114)&lt;br /&gt;
&lt;br /&gt;
===Posterize (since version 3.2)===&lt;br /&gt;
Applies a linear toon shading effect of the input. &lt;br /&gt;
&lt;br /&gt;
===TilingOffset===&lt;br /&gt;
Tiles and/or offsets the input following the given parameters.&lt;br /&gt;
&lt;br /&gt;
===Rotate ===&lt;br /&gt;
Rotates the input of the given angle in degrees.&lt;br /&gt;
&lt;br /&gt;
=== HFlip===&lt;br /&gt;
Flips the input horizontally.&lt;br /&gt;
&lt;br /&gt;
===VFlip===&lt;br /&gt;
Flips the input vertically.&lt;br /&gt;
&lt;br /&gt;
===Splatter (since version 3.0) ===&lt;br /&gt;
Splatters an Input following a grid size and randomizes its local position, rotation and scale following the given parameters. &lt;br /&gt;
&lt;br /&gt;
===Warp (since version 3.0)===&lt;br /&gt;
Warps an Input following to the given direction : Red channel for horizontal warp and green channel for vertical. Direction's blue and alpha channels are ignored. The intensity can be controlled with the Multiplier parameter.&lt;br /&gt;
&lt;br /&gt;
===Split===&lt;br /&gt;
Splits the 4 channels of the input into 4 B&amp;amp;W outputs.&lt;br /&gt;
&lt;br /&gt;
===Merge===&lt;br /&gt;
Creates a RGBA output from 4 inputs. Only the red channel of each input is considered.&lt;br /&gt;
&lt;br /&gt;
===Color===&lt;br /&gt;
Outputs a uniform color determined by a color picker.&lt;br /&gt;
&lt;br /&gt;
===RenderTexture===&lt;br /&gt;
Outputs the given RenderTexture. If the render texture size is different than the one defined in the graph settings, the input texture will appear bigger/smaller accordingly on the children nodes. &amp;lt;!-- If assets are reimported, the RenderTexture may be missing, just put it back in the object field. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Squircle===&lt;br /&gt;
Creates a squircle according to the given parameters.&lt;br /&gt;
&lt;br /&gt;
===RoundedRect===&lt;br /&gt;
Creates a rounded rectangle. Useful for capsule too.&lt;br /&gt;
&lt;br /&gt;
===Polygon ===&lt;br /&gt;
Creates a polygon according to the given parameters&lt;br /&gt;
&lt;br /&gt;
===UV===&lt;br /&gt;
Creates a UV gradient. Horizontal linear gradient in R, vertical linear gradient in G, 0 in B and 1 in A.&lt;br /&gt;
&lt;br /&gt;
===Noise===&lt;br /&gt;
Creates tileable voronoise according to the given parameters.&amp;lt;ref&amp;gt;[https://iquilezles.org/articles/voronoise Voronoise]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Voronoi===&lt;br /&gt;
Creates tileable voronoi noise according to the given parameters. Additionnal corollary outputs are also provided.&lt;br /&gt;
&lt;br /&gt;
=== FractalNoise (since version 2.0) ===&lt;br /&gt;
Creates a tileable fractal IQ Noise according to the given parameters. Supports up to 8 octaves.&lt;br /&gt;
&lt;br /&gt;
===FractalWarp (since version 2.0)===&lt;br /&gt;
Creates a tileable fractal warp based on IQ Noise according to the given parameters. Supports up to 8 octaves.&lt;br /&gt;
&lt;br /&gt;
===Caustics (since version 4.0)===&lt;br /&gt;
Creates a tileable fractal caustics noise according to the given parameters. Supports up to 8 octaves.&amp;lt;ref&amp;gt;[https://www.shadertoy.com/view/wlc3zr ShaderToy - Caustics]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Erosion (since version 4.0)===&lt;br /&gt;
Creates a tileable fractal hydrolic erosion noise according to the given parameters. Supports up to 8 octaves.&amp;lt;ref&amp;gt;[https://www.shadertoy.com/view/MtGcWh ShaderToy - Erosion]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Export===&lt;br /&gt;
Let the user export a PNG image from the input. The image will have the same size as in the graph settings. If you export a normal map, don’t forget to apply the right import settings, Seamless won’t do it automatically.&lt;br /&gt;
&lt;br /&gt;
==Tips and tricks==&lt;br /&gt;
===Make an existing picture seamlessly tileable===&lt;br /&gt;
Seamless main use case is procedural texture generation, but you can also use existing pictures and make them tileable thanks to the Splatter node. Here is how:&lt;br /&gt;
&lt;br /&gt;
*Create a CustomRenderTexture and sets its Initialization and update modes on OnLoad or Realtime according to your needs, and set your custom picture in the initialization texture field.&lt;br /&gt;
&lt;br /&gt;
*Make sure the CustomRenderTexture is the same size than the graph you want to use it in.&lt;br /&gt;
&lt;br /&gt;
*Create a new SeamlessGraph. &lt;br /&gt;
&lt;br /&gt;
*Add a RenderTexture node and  plug the CustomRenderTexture.&lt;br /&gt;
* Multiply it with a 0.5 falloff, 32 sided polygon to fade the borders. Also, you should dim the result with the multiplier parameter to avoid overexposure later.&lt;br /&gt;
&lt;br /&gt;
*Plug it as a Splatter node Input. As long as you keep low scales (lower than 3), the output is guaranteed to be tileable. For higher scales, some seams may appear, or not, it depends on your input picture.&lt;br /&gt;
*You can play with different parameters to fit your needs.[[File:Non Tileable to tileable.png|thumb|750x750px|This simple graph turns a non tileable picture to a tileable one.|center]]&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
===The node preview looks brighter than usual===&lt;br /&gt;
You are probably using linear color space instead of gamma. Don't worry, the textures will contain exactly the same data, it is just displayed differently on the screen.&lt;br /&gt;
&lt;br /&gt;
Legacy RP use gamma color space by default while URP and HDRP use linear by default. &lt;br /&gt;
&lt;br /&gt;
You can switch the color space in &amp;lt;code&amp;gt;Edit-&amp;gt;Project Settings-&amp;gt;Player-&amp;gt;Other Settings&amp;lt;/code&amp;gt; but be careful, if will change the visual aspect of your whole game.&lt;br /&gt;
&lt;br /&gt;
===All my nodes turned gray when I opened the graph===&lt;br /&gt;
You probably left the graph's tab for a while and Unity unloaded the render textures to save up memory. Click on the reload button.&lt;br /&gt;
&lt;br /&gt;
===The preview material is pink===&lt;br /&gt;
This issue can happen when switching scenes. Try to re-open the graph.&lt;br /&gt;
&lt;br /&gt;
===The preview material looks overexposed and unlit when the metallic value goes below 1 ===&lt;br /&gt;
This is a know issue in HDRP only. With a merge node, set a color whose green channel equals 0 in the occlusion slot (the actual occlusion is controlled by the red channel).&lt;br /&gt;
&lt;br /&gt;
===The preview material displays the normal map in the wrong way===&lt;br /&gt;
Make sure your normal map alpha channel is not 0. Otherwise, the standard shader will try to unpack an already unpacked normal map.&lt;br /&gt;
&lt;br /&gt;
==Contact==&lt;br /&gt;
Feel free to contact me via e-mail: [mailto:support@leochaumartin.com support@leochaumartin.com]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=Sampl&amp;diff=154</id>
		<title>Sampl</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=Sampl&amp;diff=154"/>
		<updated>2024-02-12T22:13:39Z</updated>

		<summary type="html">&lt;p&gt;Lch: /* Contact */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sampl is a powerful audio graph builder integrated in the Unity Editor. It allows&lt;br /&gt;
&lt;br /&gt;
you to bake unique procedural audio clips from noise, trigonometric or instrument primitives,&lt;br /&gt;
&lt;br /&gt;
coupled with mathematical operations, filters, etc.&lt;br /&gt;
&lt;br /&gt;
Sampl works natively with any render pipeline on any Unity version above&lt;br /&gt;
&lt;br /&gt;
2020.3&lt;br /&gt;
== Setup ==&lt;br /&gt;
The whole package is contained in the Sampl folder resulting from the import. You can move it wherever you want, but it is recommended to keep the same folder structure.&lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
You can create a new Sampl graph from the right-click context menu in the project window.&lt;br /&gt;
&lt;br /&gt;
[[File:Sampl2.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Each graph is saved as a SamplObject in a &amp;lt;code&amp;gt;.asset&amp;lt;/code&amp;gt; file. You can recognize&lt;br /&gt;
&lt;br /&gt;
them with the Sampl logo. You can change some parameters from the inspector such as sampling frequency and the length of the clip.&lt;br /&gt;
&lt;br /&gt;
[[File:Sampl1.png|frameless|713x713px]]&lt;br /&gt;
&lt;br /&gt;
You can open a graph by double-clicking on it. The window will try to dock itself next to the scene window, otherwise it will appear as a floating window, that you can dock manually.&lt;br /&gt;
[[File:Image 2023-04-27 181556615.png|center|thumb|750x750px|The provided procedural rain example]]&lt;br /&gt;
&lt;br /&gt;
== Navigation ==&lt;br /&gt;
The navigation in the main canvas is similar to other graph editors such as Shadergraph or the animator. You can zoom in/out using scroll wheel, move by click &amp;amp; drag on the mouse scroll wheel. Nodes can be selected by clicking on it, by drawing a selection rectangle, or by using Ctrl + click. You can drag selected nodes to move them.&lt;br /&gt;
&lt;br /&gt;
You cannot select or interact with links: they are 100% visual. To add a link, you must click and drag from an output, links cannot be created backwards. To remove a link you must remove one of the nodes it connect, click the red cross on its left, or connect another link to the same output node. There is a header on the top of each window containing information and buttons to save, save as, reload the graph, export all the export nodes, or show/hide stats on each node.&lt;br /&gt;
&lt;br /&gt;
To create a new node, just right click on the canvas and a context menu will appear. You can also start building a link and releasing the mouse left button in a free space, the same context menu will appear and the link will be associated with the first input (if there is any) of the added node. You can cancel by pressing ESC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Some nodes contain one or several parameters. You can change their value as a text edit or as a slider with the mouse.&lt;br /&gt;
&lt;br /&gt;
Once you are happy with a node's clip, you can export it as a static wav clip using an Export node. You can use as many Export nodes as you want. So far, Sampl only supports WAV export.&lt;br /&gt;
&lt;br /&gt;
You can browse the path by clicking on the Folder icon. Make sure you select a path included in the Assets folder of your project.&lt;br /&gt;
== Nodes list ==&lt;br /&gt;
[[File:Image 2023-05-02 093231644.png|thumb|All of Sampl's primitives|none|756x756px]]&lt;br /&gt;
=== Multiply   ===&lt;br /&gt;
Multiplies two inputs. The Multiplier parameter can adjust the output gain.&lt;br /&gt;
&lt;br /&gt;
=== Add        ===&lt;br /&gt;
Adds the two inputs &lt;br /&gt;
&lt;br /&gt;
=== Subtract   ===&lt;br /&gt;
Subtracts the input A with input B&lt;br /&gt;
&lt;br /&gt;
=== Clamp      ===&lt;br /&gt;
Clamps the input in the given range&lt;br /&gt;
&lt;br /&gt;
=== Invert     ===&lt;br /&gt;
Inverts the phase&lt;br /&gt;
&lt;br /&gt;
=== ShiftScale ===&lt;br /&gt;
A multiple parameter node to control the pitch and a relative temporal offset&lt;br /&gt;
&lt;br /&gt;
=== Lerp       ===&lt;br /&gt;
Linear interpolation between 2 clips A and B, following the T curve. T's [-1,1] interval is remapped according to the provided parameter.&lt;br /&gt;
&lt;br /&gt;
=== Warp       ===&lt;br /&gt;
Temporal warping feature. For each sample in the output clip : &amp;lt;math&amp;gt;Output[i]= Input[i + Dist[i] * Multiplier];&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reverse    ===&lt;br /&gt;
Time reverse.&lt;br /&gt;
&lt;br /&gt;
=== Remap      ===&lt;br /&gt;
Linear remapping of the input [-1,1] into the given interval.&lt;br /&gt;
&lt;br /&gt;
=== Equalizer  ===&lt;br /&gt;
Experimental. An FFT based GPU equalizer. Uses unity built-in curve widget.&lt;br /&gt;
&lt;br /&gt;
=== Reverb     ===&lt;br /&gt;
Simulates reverb. Useful to &amp;quot;smooth&amp;quot; an aggressive sound&lt;br /&gt;
&lt;br /&gt;
=== Delay      ===&lt;br /&gt;
Echoes with linear damping. You can control the number of feedbacks and their interval with the given parameters.&lt;br /&gt;
&lt;br /&gt;
=== Maximize   ===&lt;br /&gt;
Amplifies samples that are above the intensity threshold given in the parameters.&lt;br /&gt;
&lt;br /&gt;
=== Envelope  ===&lt;br /&gt;
Returns the intensity envelope of the input signal using the given window size. The ouput is always in the [0,1] interval.&lt;br /&gt;
&lt;br /&gt;
=== Resample   ===&lt;br /&gt;
Simulates a downsampling to the given number of bits.&lt;br /&gt;
&lt;br /&gt;
=== Fade       ===&lt;br /&gt;
In and Out fading.&lt;br /&gt;
&lt;br /&gt;
=== Widen      ===&lt;br /&gt;
Experimental. Useful to get a proper stereo track from a mono one.&lt;br /&gt;
&lt;br /&gt;
=== Constant   ===&lt;br /&gt;
Constant value in the interval [-1,1]&lt;br /&gt;
&lt;br /&gt;
=== Noise      ===&lt;br /&gt;
White noise.&lt;br /&gt;
&lt;br /&gt;
=== SineWave   ===&lt;br /&gt;
Pure sine wave. You can control the frequency, phase and the amplitude from the parameters. &lt;br /&gt;
&lt;br /&gt;
=== Sawtooth   ===&lt;br /&gt;
Sawtooth wave. You can control the frequency, phase and the amplitude from the parameters. &lt;br /&gt;
&lt;br /&gt;
=== TriangleWave ===&lt;br /&gt;
Triangle wave. You can control the frequency, phase and the amplitude from the parameters. &lt;br /&gt;
&lt;br /&gt;
=== SquareWave ===&lt;br /&gt;
Square wave. You can control the frequency, phase and the amplitude from the parameters. &lt;br /&gt;
&lt;br /&gt;
=== SineRamp   ===&lt;br /&gt;
Linear pure sine riser. You can control the frequencies, phase and the amplitude from the parameters. &lt;br /&gt;
&lt;br /&gt;
=== DynamicSine ===&lt;br /&gt;
Outputs a sine with a variable frequency, depending on the input and the remapping parameters provided. You can choose the sine type, phase, window size (the lower the better but also the longer to process), and amplitude from the parameters.&lt;br /&gt;
&lt;br /&gt;
===AudioClip===&lt;br /&gt;
Outputs the given AudioClip. An operation is performed to adapt the sample rate to the graph's one, but the samples are not stretched to fit the length of the clip, padding 0 are added instead (or the clip is clamped if it is longer). &amp;lt;!-- If assets are reimported, the AudioClip may be missing, just put it back in the object field. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kick       ===&lt;br /&gt;
Experimental. Close from the pad sound but dissonant. &lt;br /&gt;
&lt;br /&gt;
=== Pad        ===&lt;br /&gt;
Experimental. A simple synth sound.&lt;br /&gt;
&lt;br /&gt;
=== Curve      ===&lt;br /&gt;
Draw your own curve from unity curve input widget.&lt;br /&gt;
&lt;br /&gt;
=== Export  ===&lt;br /&gt;
Export any clip you want. Mono and Stereo are supported. The provided path must be in the Assets folder from the current project.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== The graph is frozen, spams errors and no nodes are showing up ===&lt;br /&gt;
The Unity Editor can sometimes free up memory and delete some nodes audio clips. Try to change tab if it is docked, right click on the frozen sampl graph tab and select &amp;quot;close tab&amp;quot;. Reopening the graph should solve the issue.&lt;br /&gt;
&lt;br /&gt;
==Contact==&lt;br /&gt;
Feel free to contact me via e-mail: [mailto:support@leochaumartin.com support@leochaumartin.com]&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=LC_Assets_Documentation&amp;diff=153</id>
		<title>LC Assets Documentation</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=LC_Assets_Documentation&amp;diff=153"/>
		<updated>2024-02-12T21:42:54Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&lt;br /&gt;
[[AutoLOD|'''AutoLOD - Mesh Decimator''']]&amp;lt;br&amp;gt;&lt;br /&gt;
[[AutoLOD Impostors|'''AutoLOD - Impostors''']]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Seamless|'''Seamless - Procedural Texture Builder''']]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Seamless Shadergraph Extension|'''Seamless - Shader Graph Extension''']]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Sampl|'''Sampl - Procedural Audio Clip Baker''']]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Mirage|'''Mirage (Coming soon!)''']]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=LC_Assets_Documentation&amp;diff=152</id>
		<title>LC Assets Documentation</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=LC_Assets_Documentation&amp;diff=152"/>
		<updated>2024-02-12T21:38:01Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== [[AutoLOD|AutoLOD - Mesh Decimator]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[AutoLOD Impostors|AutoLOD - Impostors]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[Seamless|Seamless - Procedural Texture Builder]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[Seamless Shadergraph Extension|Seamless - Shader Graph Extension]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[Sampl|Sampl - Procedural Audio Clip Baker]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[Mirage|Mirage (Coming soon!)]] ===&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=LC_Assets_Documentation&amp;diff=151</id>
		<title>LC Assets Documentation</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=LC_Assets_Documentation&amp;diff=151"/>
		<updated>2024-02-12T21:36:57Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[AutoLOD|AutoLOD - Mesh Decimator]] &lt;br /&gt;
&lt;br /&gt;
[[AutoLOD Impostors|AutoLOD - Impostors]] &lt;br /&gt;
&lt;br /&gt;
[[Seamless|Seamless - Procedural Texture Builder]] &lt;br /&gt;
&lt;br /&gt;
[[Seamless Shadergraph Extension|Seamless - Shader Graph Extension]] &lt;br /&gt;
&lt;br /&gt;
[[Sampl|Sampl - Procedural Audio Clip Baker]] &lt;br /&gt;
&lt;br /&gt;
[[Mirage|Mirage (Coming soon!)]]&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=LC_Assets_Documentation&amp;diff=150</id>
		<title>LC Assets Documentation</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=LC_Assets_Documentation&amp;diff=150"/>
		<updated>2024-02-12T21:36:18Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== [[AutoLOD|AutoLOD - Mesh Decimator]] &lt;br /&gt;
[[AutoLOD Impostors|AutoLOD - Impostors]] &lt;br /&gt;
[[Seamless|Seamless - Procedural Texture Builder]] &lt;br /&gt;
[[Seamless Shadergraph Extension|Seamless - Shader Graph Extension]] &lt;br /&gt;
[[Sampl|Sampl - Procedural Audio Clip Baker]] &lt;br /&gt;
[[Mirage|Mirage (Coming soon!)]] ===&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=149</id>
		<title>Mirage</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=Mirage&amp;diff=149"/>
		<updated>2024-02-12T21:31:18Z</updated>

		<summary type="html">&lt;p&gt;Lch: /* Contours */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Setup ==&lt;br /&gt;
The whole package is contained in the Mirage folder resulting from the import but you can move it wherever you want.&lt;br /&gt;
&lt;br /&gt;
== What is an impostor ==&lt;br /&gt;
An impostor or imposter is a dynamically rendered billboard texture map used to stand in for geometry in the distance. &lt;br /&gt;
&lt;br /&gt;
In Mirage context, you can have as many objects as you want in a single impostor, and all the the points of view are stored into an abedo map and an optional normal map atlas map per impostor. Smoothness, metallic or occlusion are not baked into textures but are still customizable on post baking options.&lt;br /&gt;
== How to bake an impostor ==&lt;br /&gt;
&amp;lt;code&amp;gt;Mirage&amp;lt;/code&amp;gt; consists in a single editor window. You can open it via &amp;lt;code&amp;gt;Window-&amp;gt;Mirage-&amp;gt;Impostors&amp;lt;/code&amp;gt;. For a simple one-click impostor approach, drag and drop the common ancestor of all the objects you want to bake into target area and click on the Generate Impostor button. &lt;br /&gt;
&lt;br /&gt;
You can also customize a lot of settings for a more advanced usage. There are 5 category foldouts that that can expand or hide by clicking on their title. Even when hidden, they still provide basic information or controls on the right of the title. &lt;br /&gt;
&lt;br /&gt;
The following sections will provide detailed explaination of each of the categories.[[File:Image 2024-02-06 164734156.png|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
=== Setup the target(s) ===&lt;br /&gt;
This category holds all the source object(s) information. Note that only one impostor can be baked at a time, so all the target will all be part of the same impostor. &lt;br /&gt;
For a simple one-click impostor approach, drag and drop the common ancestor in the dedicated field. Note that if you want to bake only one object the common ancestor can be the object itself or its parent. When the common ancestor is set, Mirage will automatically detect all the mesh filters in its children, recursively. You can check which mesh filters are included by expanding the section as following. Null or invalid objects will be ignored. &lt;br /&gt;
[[File:Image 2024-02-06 170842562.png|center|thumb|357x357px]]&lt;br /&gt;
You can also exclude some meshes or add some manually by dropping them into the area. If you change the mesh filters manually, the common ancestor will be updated accordingly. Note that '''a common ancestor is needed to bake an impostor'''. &lt;br /&gt;
&lt;br /&gt;
=== Quality Settings ===&lt;br /&gt;
This category is crucial and will have a direct impact on the visual quality of the impostor. Provides full control over the baking topology. This section should be paired with the Information category that provides real-time visualization for an excellent and fast control over the baking topology.&lt;br /&gt;
[[File:Image 2024-02-06 172158522.png|center|thumb|483x483px]]&lt;br /&gt;
&lt;br /&gt;
==== Texture Size ====&lt;br /&gt;
As previously mentionned, Color Maps and Normal Maps are stored into square POT atlases. This field controls the resolution of these atlases, from 128x128 to 4096x4096. The Estimated Size label provides the size of the whole impostor prefab after baking (with DXT compression) &lt;br /&gt;
&lt;br /&gt;
==== Sphere Type ====&lt;br /&gt;
&lt;br /&gt;
*'''UV sphere''': The default choice.  The UV sphere is based on a fixed number of longitude and latitude samples.  The coverage is denser at the poles.The UV Sphere is a solid choice in many use cases, with more versatility regarding partial sphere baking.&lt;br /&gt;
*'''Pseudo-Fibonacci sphere''': at an experimental stage.  Provides a homogeneous coverage. Not compatible with latitude interpolation in the impostor shader. Despite being homogeneous, the output impostor will look smooth near the equator, with more noticeable snaps or blur around the poles. Full sphere baking only.&lt;br /&gt;
&lt;br /&gt;
==== Longitude Samples ====&lt;br /&gt;
UV Sphere only. Holds the number of longitudinal samples. The higher the better for smooth horizontal rotation, at a cost of higher POV number thus resolution/POV in the atlas. All samples are equally spread around the 360 degrees.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Samples ====&lt;br /&gt;
UV Sphere only. Holds half of the number of latitudinal samples (equator excluded). This means that a 0 value will just bake around the equator. 1 will bake an additionnal sample on each side of the equator, and so on.&lt;br /&gt;
&lt;br /&gt;
The higher the better for smooth vertical rotation, at a cost of higher POV number thus resolution/POV in the atlas. &lt;br /&gt;
&lt;br /&gt;
==== Laatitude Offset ====&lt;br /&gt;
UV Sphere only. Shifts the equator sample. Useful for partial spheres.&lt;br /&gt;
&lt;br /&gt;
==== Latitude Step ====&lt;br /&gt;
UV Sphere only. Holds angular offset between two latitudinal samples. A small value will increase smoothness of vertical rotation, but may limit the global latitudinal range.  &lt;br /&gt;
&lt;br /&gt;
==== Density ====&lt;br /&gt;
Pseudo-Fibonacci sphere only. Controls the density of the sphere. The higher the better for smooth rotations in any direction, at a cost of higher POV number thus resolution/POV in the atlas.&lt;br /&gt;
&lt;br /&gt;
==== Lighting Method ====&lt;br /&gt;
&lt;br /&gt;
# '''Normal Estimation'''Computes a dedicated normal map atlas to get physically correct light reflections on the impostor. The recommended method. The baked impostor will use a lit surface shader.&lt;br /&gt;
# '''Use Scene Sun Source'''Adds the sun source of the opened scene in the baking context. Can provide better results on single lit scenes, especially with intricate metallic/smoothness/self shading objects. The baked impostor will use an unlit shader.&lt;br /&gt;
&lt;br /&gt;
==== Presets ====&lt;br /&gt;
You can add/load presets easily with the dedicated buttons. Gives an additional degree of freedom to match your workflow. A few relevant presets are already included such as 1-POV-billboard or different hemispheres.&lt;br /&gt;
&lt;br /&gt;
=== Information ===&lt;br /&gt;
The whole information foldout is readonly. and provides useful visual feedback to help tweaking the previous category fileds.&lt;br /&gt;
&lt;br /&gt;
[[File:Image 2024-02-06 180549368.png|center|thumb|426x426px]]&lt;br /&gt;
On the left column, some metrics are displayed. The values will appear in green is considered valid, orange when considered too low/high. Please note that these colors are purely informative and won't inhibit the impostor generation. &lt;br /&gt;
&lt;br /&gt;
* The total number of POV.  For UV Sphere Baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = S_{Long}*S_{Lat}&amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt; For Pseudo-Fibonacci Sphere baking : &amp;lt;big&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;N_{POV} = \sum_{l=-S_{Lat}/2}^{S_{Lat}/2}cos(\frac{2\pi.l}{S_{Lat}}).S_{Long} &amp;lt;/math&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The Atlas POV size. 15x15 means there are 15 POVs per line and per column.&lt;br /&gt;
* Single POV resolution&lt;br /&gt;
* The atlas coverage : if &amp;lt;math&amp;gt;\sqrt{N_{POV}}&amp;lt;/math&amp;gt; is an integer, the coverage will be 100% otherwise there will be blank slots in the atlas. 100% is better but not necessary.&lt;br /&gt;
* Unused memory : The estimated memory held by the blank slots in the grid. Will be 0 if the coverage is 100% &lt;br /&gt;
&lt;br /&gt;
On the right area stand 3 tabs for more visual information.&lt;br /&gt;
&lt;br /&gt;
* POVs : Visualize the Longitude / Latitude coverage. A great helper when tweaking the Quality Settings. You can orbit around with the mouse to see clearer.&lt;br /&gt;
* Layout : Visualize the Atlas  layout. Filled atlas slots will be green, blank will be red.&lt;br /&gt;
* Preview :  Visualize how pixelated your each single POV will be. Displays the actual objects entered in the Target foldout. You can orbit around with the mouse as well. Please note the snappiness/bluriness won't be previewed here. The area only shows your inputs layout in the impostor and the pixelization but does not stand for a contractual appearance of the ouput impostor.&lt;br /&gt;
&lt;br /&gt;
=== LODGroup Settings ===&lt;br /&gt;
This category is not crucial since you can always modify it afterwards, but it can make you save a lot a time. If you just want to bake the impostor to a prefab without adding it to the scene, you can untick the field Automatic Setup.&lt;br /&gt;
[[File:Image 2024-02-06 183403606.png|center|thumb|394x394px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 4 possible scenarios for this area. &lt;br /&gt;
&lt;br /&gt;
* None of the input meshes are part of a LODGroup : A LODGroup will be added on the common ancestor. all the source renderers will be added in LOD0 and the impostor will be added in LOD1 following the given settings. A cross fading is added for smooth transitions.&lt;br /&gt;
* There is already a LODGroup but no impostors : The impostor will be added in an additional LOD level following the given parameters. Note that all the source renderers MUST belong to either no LOD or the same LOD level from the same LODGroup to avoid nested LODGroup errors.&lt;br /&gt;
* There is already a LODGroup with an impostor : The impostor will be replaced using the same relative height transition. Note that impostors are detected thanks to the ImpostorReference script attached to the LODGroup. If you want to have several impostors in the same LODGroup, just delete safely the ImpostorReference component before baking. Also, the previous impostor's prefab will not be deleted, only the instance in the scene will be replaced.&lt;br /&gt;
* There isn't any common ancestor for the input objects. Baking won't be possible.&lt;br /&gt;
&lt;br /&gt;
== Save Path ==&lt;br /&gt;
Impostors are saved as packed prefabs, embedding the quad mesh, the atlas(es) and the material. You can customize this path in this section.&lt;br /&gt;
[[File:Image 2024-02-06 184910768.png|center|thumb|401x401px]]&lt;br /&gt;
You can either type the path relative to the Assets folder or use the file browser with the dedicated button.&lt;br /&gt;
&lt;br /&gt;
The label underneath the text field hold the actual, unique path that will be used for the impostor. &lt;br /&gt;
&lt;br /&gt;
If the path contains one or more non-existing directories, they will be created automatically at baking time.&lt;br /&gt;
&lt;br /&gt;
Note that no file nor directory is created before baking. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Post-baking adjustments ==&lt;br /&gt;
Both the Lit and Unlit impostor materials have a custom Shader GUI where you can perform advanced post-baking adjustments.&lt;br /&gt;
[[File:Image 2024-02-06 190047781.png|center|thumb|865x865px]]&lt;br /&gt;
&lt;br /&gt;
=== Billboarding ===&lt;br /&gt;
The billboarding effect consists in making the quad face the camera at any time. This is performed in the vertex shader stage. &lt;br /&gt;
&lt;br /&gt;
* You can disable it with the dedicated toggle.&lt;br /&gt;
* Clamp Latitude will stop the vertical billboard effect if the view angle gets out of the latitudinal range. The horizontal billboarding will remain.&lt;br /&gt;
* Z Offset can get the a impostor closer from the camera. Really useful to get the most out of the LODGroup's crossfading effect, or to adapt the size at closer range without altering longer ranges.&lt;br /&gt;
&lt;br /&gt;
=== Surface ===&lt;br /&gt;
Due to the lack of smoothness, metallic and occlusion maps, it is sometimes required to tweak some surface parameters to match the source objects better.&lt;br /&gt;
* The Brightness slider can increase/decrease the albedo power.&lt;br /&gt;
* The Saturation slider can increase/decrease the color saturation.&lt;br /&gt;
* The Smoothness/Metallic/Occlusion sliders work the same way than the default diffuse material.&lt;br /&gt;
* The Curvature Occlusion slider applies an additionnal occlusion in rifts, and sharp angles, to estimate self-shades.&lt;br /&gt;
&lt;br /&gt;
=== Contours ===&lt;br /&gt;
Impostors use opaque materials. To get the contours right we use alpha clipping to discard pixels that are not representing the object on each POV. The contours are usually fine out-of-the-box, but sometimes it is required to adjust a few settings.&lt;br /&gt;
* The Cutout slider can increase/decrease the sharpness of the alpha clipping geometry. You should not go higher than 0.5 to avoid cropping some important features.&lt;br /&gt;
&lt;br /&gt;
* The Interpolate toggle turns On/Off impostor bilinear interpolation smoothing. Interpolation removes the snapping effect, but adds blur. Note that interpolation adds shader complexity.&lt;br /&gt;
&lt;br /&gt;
* The Dithering Fade toggle turns On/Off Dithering fading on the edges of the impostor. Independant from the LODGroup crossfade effect.&lt;br /&gt;
&lt;br /&gt;
[[File:Impostor2.gif|thumb|429x429px|From left to right: The original model, interpolation enabled, interpolation disabled.|center]]&lt;br /&gt;
&lt;br /&gt;
=== Geometry ===&lt;br /&gt;
These settings are theoritically not needed but are a way of giving additionnal freedom to advanced users.&lt;br /&gt;
* The Yaw/Elevation offset sliders make the object virtually rotate on the Horizontal/Vertical axis respectively. &lt;br /&gt;
&lt;br /&gt;
=== Advanced Options ===&lt;br /&gt;
You can control the Render Queue, Double sided Global Illumation and GPU instancing, like the default surface shader. &lt;br /&gt;
&lt;br /&gt;
== Compatible objects ==&lt;br /&gt;
Mirage Impostors are compatible with any object with a MeshFilter and a MeshRenderer attached. &lt;br /&gt;
&lt;br /&gt;
Note that translations (on all axes), scaling (on all axes) and rotation (around the vertical axis only) are supported. &lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
Due to their nature, Mirage impostors have their few limitations.&lt;br /&gt;
&lt;br /&gt;
* Full rotation compatibility : as said just above, the impostors won't be rotated around X and Z axes even if their parent does. &lt;br /&gt;
* Lossy scale : Mirage uses the transforms [https://docs.unity3d.com/ScriptReference/Transform-lossyScale.html lossyScale] of the source objects. If the source objects are skewed by nested non uniform scaling a rotation, the impostor may be a appear close from but source but unskewed.&lt;br /&gt;
* Shadows : Mirage impostors are compatible with shadows but they are not physically correct since it only projects the alpha clipped quad instead of having a dedicated shadow pass. It means shadow will be correct if the light comes from the front or the back but not the sides of the impostor. This is a simplicity choice, since correct shadow would add a GPU-intensive shader pass and shadows are usually not even visible from the impostor nominal distance. Moreover, it keeps Mirage natively pipeline independant since shader graph is not designed to add this kind of advanced features.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Didn't find what you were searching for?&lt;br /&gt;
&lt;br /&gt;
Feel free to contact me by email or on my discord channel.&lt;br /&gt;
&lt;br /&gt;
[mailto:support@leochaumartin.com support@leochaumartin.com]&lt;br /&gt;
&lt;br /&gt;
https://discord.gg/kYwzdvAt8q&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://www.gamedeveloper.com/programming/dynamic-2d-imposters-a-simple-efficient-directx-9-implementation&lt;br /&gt;
&lt;br /&gt;
https://calcifer.org/kenneth-christiansen/ComputerScience/imposters.pdf&lt;br /&gt;
&lt;br /&gt;
https://developer.nvidia.com/gpugems/gpugems3/part-iv-image-effects/chapter-21-true-impostors&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=LC_Assets_Documentation&amp;diff=148</id>
		<title>LC Assets Documentation</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=LC_Assets_Documentation&amp;diff=148"/>
		<updated>2024-02-12T21:29:48Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[AutoLOD|AutoLOD - Mesh Decimator]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[AutoLOD Impostors|AutoLOD - Impostors]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Seamless|Seamless - Procedural Texture Builder]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Seamless Shadergraph Extension|Seamless - Shader Graph Extension]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Sampl|Sampl - Procedural Audio Clip Baker]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Mirage|Mirage (Coming soon!)]]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=LC_Assets_Documentation&amp;diff=147</id>
		<title>LC Assets Documentation</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=LC_Assets_Documentation&amp;diff=147"/>
		<updated>2024-02-12T21:28:46Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[AutoLOD|AutoLOD - Mesh Decimator]]&lt;br /&gt;
&lt;br /&gt;
[[AutoLOD Impostors|AutoLOD - Impostors]]&lt;br /&gt;
&lt;br /&gt;
[[Seamless|Seamless - Procedural Texture Builder]]&lt;br /&gt;
&lt;br /&gt;
[[Seamless Shadergraph Extension|Seamless - Shader Graph Extension]]&lt;br /&gt;
&lt;br /&gt;
[[Sampl|Sampl - Procedural Audio Clip Baker]]&lt;br /&gt;
&lt;br /&gt;
[[Mirage|Mirage]]&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=LC_Assets_Documentation&amp;diff=146</id>
		<title>LC Assets Documentation</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=LC_Assets_Documentation&amp;diff=146"/>
		<updated>2024-02-12T21:28:33Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[AutoLOD|AutoLOD - Mesh Decimator]]&lt;br /&gt;
[[AutoLOD Impostors|AutoLOD - Impostors]]&lt;br /&gt;
[[Seamless|Seamless - Procedural Texture Builder]]&lt;br /&gt;
[[Seamless Shadergraph Extension|Seamless - Shader Graph Extension]]&lt;br /&gt;
[[Sampl|Sampl - Procedural Audio Clip Baker]]&lt;br /&gt;
[[Mirage|Mirage]]&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=145</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=145"/>
		<updated>2024-02-11T23:26:07Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
.minerva-header .branding-box a {&lt;br /&gt;
    color:#00000000;&lt;br /&gt;
    height: 50px&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.minerva-header .branding-box {&lt;br /&gt;
    background-image: url('/wiki/resources/assets/LC_Logo_Full_1x.png'); /* Path to your logo */&lt;br /&gt;
    background-size: contain; /* Adjust as necessary to fit the logo */&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
    background-position: left center;&lt;br /&gt;
    height: 50px; /* Adjust the height according to your logo's size */&lt;br /&gt;
    width: 100%; /* Adjust if you want a specific width */&lt;br /&gt;
    opacity: 0.85;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.header-container.header-chrome {&lt;br /&gt;
    background-color: #BACDCD;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=144</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=144"/>
		<updated>2024-02-11T23:19:06Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
.minerva-header .branding-box a {&lt;br /&gt;
    color:#00000000;&lt;br /&gt;
    height: 50px&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.minerva-header .branding-box {&lt;br /&gt;
    background-image: url('/wiki/resources/assets/LC_Logo_Full_1x.png'); /* Path to your logo */&lt;br /&gt;
    background-size: contain; /* Adjust as necessary to fit the logo */&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
    background-position: left center;&lt;br /&gt;
    height: 50px; /* Adjust the height according to your logo's size */&lt;br /&gt;
    width: 100%; /* Adjust if you want a specific width */&lt;br /&gt;
    opacity: 0.85;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.header-container.header-chrome {&lt;br /&gt;
    background-color: #AABDBD;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=143</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=143"/>
		<updated>2024-02-11T23:09:06Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
.minerva-header .branding-box a {&lt;br /&gt;
    color:#00000000;&lt;br /&gt;
    height: 50px&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.minerva-header .branding-box {&lt;br /&gt;
    background-image: url('/wiki/resources/assets/LC_Logo_Full_1x.png'); /* Path to your logo */&lt;br /&gt;
    background-size: contain; /* Adjust as necessary to fit the logo */&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
    background-position: left center;&lt;br /&gt;
    height: 50px; /* Adjust the height according to your logo's size */&lt;br /&gt;
    width: 100%; /* Adjust if you want a specific width */&lt;br /&gt;
    opacity: 0.85;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.header-container.header-chrome {&lt;br /&gt;
    background-color: #A0BDBD;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=142</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=142"/>
		<updated>2024-02-11T23:08:38Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
.minerva-header .branding-box a {&lt;br /&gt;
    color:#00000000;&lt;br /&gt;
    height: 50px&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.minerva-header .branding-box {&lt;br /&gt;
    background-image: url('/wiki/resources/assets/LC_Logo_Full_1x.png'); /* Path to your logo */&lt;br /&gt;
    background-size: contain; /* Adjust as necessary to fit the logo */&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
    background-position: left center;&lt;br /&gt;
    height: 50px; /* Adjust the height according to your logo's size */&lt;br /&gt;
    width: 100%; /* Adjust if you want a specific width */&lt;br /&gt;
    opacity: 0.85;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.header-container.header-chrome {&lt;br /&gt;
    background-color: #90ADAD;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=141</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=141"/>
		<updated>2024-02-11T23:07:50Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
.minerva-header .branding-box a {&lt;br /&gt;
    color:#00000000;&lt;br /&gt;
    height: 50px&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.minerva-header .branding-box {&lt;br /&gt;
    background-image: url('/wiki/resources/assets/LC_Logo_Full_1x.png'); /* Path to your logo */&lt;br /&gt;
    background-size: contain; /* Adjust as necessary to fit the logo */&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
    background-position: left center;&lt;br /&gt;
    height: 50px; /* Adjust the height according to your logo's size */&lt;br /&gt;
    width: 100%; /* Adjust if you want a specific width */&lt;br /&gt;
    opacity: 0.85;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.header-container.header-chrome {&lt;br /&gt;
    background-color: #809D9D;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=AutoLOD&amp;diff=140</id>
		<title>AutoLOD</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=AutoLOD&amp;diff=140"/>
		<updated>2024-02-11T16:08:33Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AutoLOD is a very simple tool that will generate a LOD group with any 3D&lt;br /&gt;
&lt;br /&gt;
object from your scene. It will automatically compute simplified version of your&lt;br /&gt;
[[File:Image 2023-10-30 141342560.png|thumb|606x606px|The AutoLOD editor window under several states of customization]]&lt;br /&gt;
meshes using decimation.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
The whole package is contained in the AutoLOD folder resulting from the import. You can move it wherever you want, but it is recommended to keep the same folder structure.&lt;br /&gt;
&lt;br /&gt;
== How to use ==&lt;br /&gt;
AutoLOD consists in an editor window. You can open it via &amp;lt;code&amp;gt;Window-&amp;gt;AutoLOD-&amp;gt;MeshDecimator&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[File:How_to_open_the_window.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
Put the object(s) to be processed into the ”targets” area. Please note that a Renderer is required otherwise the object cannot be added.&lt;br /&gt;
[[File:AutoLOD_MAN2.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
By default, the same presets will be applied to every renderer in the list.&lt;br /&gt;
&lt;br /&gt;
You can customize these presets in the Custom Settings section.&lt;br /&gt;
&lt;br /&gt;
You can also customize per-object settings by folding out targets in the list.&lt;br /&gt;
[[File:Autolod_MAN3.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
Both settings panels are identical, meaning that each object is fully customizable independantly from others or from the common settings.&lt;br /&gt;
[[File:Autolod_MAN4.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
The LODGroup Settings foldout let you control the LODGroup setup as it should be when created, but you can still change it manually when the process is over. You cannot interact with the LODGroup widget (which is NOT the actual widget, but just a representation), only the sliders LOD Levels, Seamless/Performant and Size Culling will influence it.&lt;br /&gt;
[[File:Autolod_MAN5.png|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
Since 4.0, decimated meshes will be saved to the assets, to the given path. If the path does not exist, the program will automatically create it for you.&lt;br /&gt;
&lt;br /&gt;
When you are ready, just click on the button &amp;lt;code&amp;gt;Generate LOD&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* Minimalist interface and really easy to use&lt;br /&gt;
* Exposes 2 backends to the users : a fast to be used for prototyping of dynamic usage, and a quality for higher quality outputs (since version 5.0)&lt;br /&gt;
* Works in both edit and play mode&lt;br /&gt;
* Works on prefabs instances (no need to unpack them)&lt;br /&gt;
* You can change the default export path from &amp;lt;code&amp;gt;Edit-&amp;gt;Preferences-&amp;gt;AutoLOD Settings&amp;lt;/code&amp;gt;&lt;br /&gt;
* Generates up to 8 LOD for a single object&lt;br /&gt;
* Decimates UVs (from uv1 to uv4) and bone weights too.&lt;br /&gt;
* Compatible with sub-meshes&lt;br /&gt;
* Compatible with SkinnedMeshRenderers with bones and blendshapes support&lt;br /&gt;
* Can be used for simple distance culling too&lt;br /&gt;
* Fully compatible with any render pipeline and any unity version since 2020.3 LTS.&lt;br /&gt;
&lt;br /&gt;
== Backends ==&lt;br /&gt;
Since AutoLOD 5.0, you can now choose which backend you want to use between the fast or high quality. Both backends implement Fast quadric mesh simplification but the high quality preserves better UVs and preserve borders. &lt;br /&gt;
[[File:AutoLOD Backends.png|alt=Demonstration of AutoLOD embedded fast and HQ decimation backends|thumb|514x514px|AutoLOD embedded fast and HQ decimation backends]]&lt;br /&gt;
&lt;br /&gt;
== Runtime API ==&lt;br /&gt;
All the following methods are part of the &amp;lt;code&amp;gt;AutoLOD.MeshDecimator&amp;lt;/code&amp;gt; namespace.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;void CFastMeshDecimator.Initialize()&amp;lt;/code&amp;gt;&lt;br /&gt;
: Initializes the MeshDecimator with the Fast backend. This method sets up necessary components or variables required before the decimation process begins.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Mesh CFastMeshDecimator.DecimateMesh(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Decimates the provided mesh (''sourceMesh'') to a specified number of faces (''targetFaceCount'') using the Fast backend.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;static Mesh CFastMeshDecimator.DecimateMeshStatic(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Provides a static method to decimate a mesh without needing an instance of the FastMeshDecimator class. It takes a mesh (''sourceMesh'') and decimates it to the specified number of faces (''targetFaceCount'') using the Fast backend.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;void CQualityMeshDecimator.Initialize()&amp;lt;/code&amp;gt;&lt;br /&gt;
: Initializes the MeshDecimator with the High Quality backend. This method sets up necessary components or variables required before the decimation process begins.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Mesh CQualityMeshDecimator.DecimateMesh(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Decimates the provided mesh (''sourceMesh'') to a specified number of faces (''targetFaceCount'') using the Quality backend.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;static Mesh CQualityMeshDecimator.DecimateMeshStatic(Mesh sourceMesh, int targetFaceCount, bool interpolateBlendshapes = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Provides a static method to decimate a mesh without needing an instance of the QualityMeshDecimator class. It takes a mesh (''sourceMesh'') and decimates it to the specified number of faces (''targetFaceCount'') using the Quality backend.&lt;br /&gt;
&lt;br /&gt;
== Some tips ==&lt;br /&gt;
&lt;br /&gt;
* A demo scene is provided in the Scene folder: click play and follow the instructions. The provided material in the scene should appear pink in LWRP/URP and HDRP. Feel free to upgrade the material to your render pipeline, or use your own material.&lt;br /&gt;
* Setting 1 on LOD Levels will just apply a distance culling (and an automatic decimation if the toggle is enabled).&lt;br /&gt;
* You can apply changes to a prefab instance, as long as the decimated mesh were saved to the Assets (otherwise the meshes will be missing, as they are stored in the scene data).&lt;br /&gt;
* You can undo the whole AutoLOD process with Edit -&amp;gt; Undo&lt;br /&gt;
* You can put several objects in the drag and drop area. AutoLOD will just add the valid ones to the list.&lt;br /&gt;
* You can add a MeshRenderer or SkinnedMeshRenderer from its context menu in the inspector&lt;br /&gt;
&lt;br /&gt;
== Warnings ==&lt;br /&gt;
&lt;br /&gt;
* Generation can take a long time for a whole scene. Unity will freeze during the process but a progress bar will provide some progress report. The progress bar is more precise for Unity 2020 and above than the previous releases.&lt;br /&gt;
* If the processed object has specific components attached to it, they will remain but make sure they still work properly. If they were using the attached MeshFilter or Renderer, they will probably be broken, but it should be easy to fix in most cases.&lt;br /&gt;
* Please check carefully which objects you put in AutoLOD and understand that there are just too many cases that can end up with bugs, especially with your MonoBehaviour scripts.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Feel free to contact me via one of the social media availbale on the bottom of&lt;br /&gt;
&lt;br /&gt;
the AutoLOD editor window or via e-mail: [mailto:support@leochaumartin.com support@leochaumartin.com]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://github.com/Whinarn/MeshDecimator&lt;br /&gt;
&lt;br /&gt;
https://github.com/crescent3983/UnityMeshDecimation&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=Wiki:About&amp;diff=139</id>
		<title>Wiki:About</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=Wiki:About&amp;diff=139"/>
		<updated>2024-02-11T15:56:25Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
'''Embedded system engineer during the day, game developper at night.'''&lt;br /&gt;
&lt;br /&gt;
Passionate about mesh manipulation and technical art. &lt;br /&gt;
I develop tool assets on my free time.&lt;br /&gt;
&lt;br /&gt;
LC Assets&lt;br /&gt;
&lt;br /&gt;
832 128 037 RCS TOULON  &lt;br /&gt;
&lt;br /&gt;
FRANCE&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=Wiki:About&amp;diff=138</id>
		<title>Wiki:About</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=Wiki:About&amp;diff=138"/>
		<updated>2024-02-11T15:54:36Z</updated>

		<summary type="html">&lt;p&gt;Lch: Created page with &amp;quot; Embedded system engineer during the day, game developper at night. Passionate about mesh manipulation and technical art.  I develop tool assets on my free time.  LC Assets 832 128 037 RCS TOULON   FRANCE&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Embedded system engineer during the day, game developper at night.&lt;br /&gt;
Passionate about mesh manipulation and technical art. &lt;br /&gt;
I develop tool assets on my free time.&lt;br /&gt;
&lt;br /&gt;
LC Assets&lt;br /&gt;
832 128 037 RCS TOULON  &lt;br /&gt;
FRANCE&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=MediaWiki:Mainpage-title-loggedin&amp;diff=137</id>
		<title>MediaWiki:Mainpage-title-loggedin</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=MediaWiki:Mainpage-title-loggedin&amp;diff=137"/>
		<updated>2024-02-11T14:15:28Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Find the asset documention you are looking for.&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=MediaWiki:Mainpage-title-loggedin&amp;diff=136</id>
		<title>MediaWiki:Mainpage-title-loggedin</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=MediaWiki:Mainpage-title-loggedin&amp;diff=136"/>
		<updated>2024-02-11T14:14:22Z</updated>

		<summary type="html">&lt;p&gt;Lch: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=MediaWiki:Mainpage-title&amp;diff=135</id>
		<title>MediaWiki:Mainpage-title</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=MediaWiki:Mainpage-title&amp;diff=135"/>
		<updated>2024-02-11T14:13:42Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Find the asset documentation your are looking for.&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
	<entry>
		<id>https://leochaumartin.com/wiki/index.php?title=MediaWiki:Mainpage-title&amp;diff=134</id>
		<title>MediaWiki:Mainpage-title</title>
		<link rel="alternate" type="text/html" href="https://leochaumartin.com/wiki/index.php?title=MediaWiki:Mainpage-title&amp;diff=134"/>
		<updated>2024-02-11T14:12:27Z</updated>

		<summary type="html">&lt;p&gt;Lch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-&lt;/div&gt;</summary>
		<author><name>Lch</name></author>
	</entry>
</feed>