Converts distant complex 3D objects into simple 2D quads which significantly reduces triangles and drawcalls.
Purely runtime. No baking, no preprocessing, just seamless execution.Impostors package doesn’t officially support custom SRPs.But you are able to provide(implement) a custom Render Pipeline Proxy for your project.Shaders must support forward rendering, but the project itself can use either Deferred or Forward rendering paths.Next generation of Imposter System asset with DOTS in mind.When creating big worlds it's important to show users large-scale scenes with lots of objects in the background. That's a tough task that requires optimizing shaders, materials, meshes, and so on.With the help of Impostors, you can greatly simplify this task!Impostor - fake object(quad), that tries to look like its original object. It's very cheap to render but with a trade-off between performance and visual quality.We don't really need high visual quality at distance, because distant objects take tiny space on the screen. That's why there are techniques like LODs (Level Of Detail).Impostors expand this approach, and in some cases can completely replace it.Why impostors?There are several problems with LODsit requires manually creating additional assets for each object - meshes with fewer polygons and materials,these additional assets increase build size,there might be a noticeable difference between LODs, which pop in and out when player moves.Poping problem is really hard to solve because it's just the trade-off between performance and visual quality. But with Impostors we can solve the first two issues:impostors don't require manually creating additional assets,impostors don't increase build size,impostors work with stylized custom shading,in perfect scenarios impostors look exactly like the original objects.How impostors workThe concept of impostors is quite simple. We just take a photo of the object from a specific angle, and then show this photo as a sprite instead of the original object. Sprites are super cheap to render: they use special shader without lightning calculation and require only 2 triangles to draw. Whenever camera changes position we need to regenerate the photo to represent object from a new angle.Important noteAgain, we stuck with the trade-off between performance and visual quality.Impostors are not a panacea and cannot replace standard rendering.But it provides the opportunity to fill your scene with lots of distant details if your project fits several conditions.When to use impostorsBefore we continue with this chapter I want to mention: if you have any doubts or questions about impostors working with your project, feel free to contact me with some gameplay footage or at least a high-level overview of what is going on in your game. I will try my best to answer your questions and let you know whether Impostors fits your project.Last note, Asset Store provides refunds, and I have never rejected refund requests, so you are covered.1. Camera rarely changes positionThe best scenario for impostors!Regenerating impostor's image is a rendering operation, which we are trying to avoid as much as possible. When camera doesn't move we don't need to update anything.Genres: VR with teleportation movement or steady gameplay, visual novels, side-scrollers.2. First-person character cameraWorks perfectly with impostors!Genres: open-world FPS, battle-royal, survivals.3. Flying or top-down cameraSuch camera behavior requires constantly regenerating photos of impostors, which leads to way less performance boost. However, I can't say that impostors cannot be used in such games! Example scene shows exactly that scenario.4. Fast-paced camera movementThe weak part of impostors.Games like racing and flying simulators might not work with impostors as good as others. It depends on what you are trying to achieve. Feel free to contact me and we will try to understand whether your project works with impostors or not.5. Games with procedural objectsIf your game has procedurally generated meshes, I doubt you have LODs for them:)In such a situation Impostors package comes handy because it generates everything at runtime!6. Low-poly gamesIt depends on the platform you targeting and the count of objects you want to present in your scene. Generally speaking, impostors are overkill for games with a low poly count.Limitations- Requires shaders that support forward rendering and RGBA ColorMask.- Whenever lighting condition changes impostors' images need to be updated.- At a close distance it's quite easy to distinguish impostor from the original object, so they must be used at most at 10% of camera screen size.- For now, Impostors doesn't support semi-transparent objects. Only Opaque and AlphaTest/Cutout shaders.- For now, Impostors supports only one directional light plus ambient light.Features:Significant decrease in poly and drawcall countsWorks with stylized custom shadingNo asset pre-processing, no bakingNo additional assetsDoesn't increase build sizeGenerates everything at runtimeFast setupMultiple camerasVR (tested with Oculus Quest)Utilizes max performance using Jobs and BurstSupports moving objectsDependencies:Unity 2020.3.16 - 2023.1.XBurstMathematicsCollectionsSupported Render Pipelines:Built-inUniversalIt may be used in custom RP (requires a bit of coding to embed impostors into RP)NO OFFICIAL SUPPORT FOR HDRPSupported platforms:Every platform that supports render textures, which is almost every platform supported by Unity.WebGL is an exception because it doesn't work with the multithreading Jobs System.Links:DocumentationForumSupported Unity versions:2020.3.16+ LTS2021.3 LTS2022.3 LTS2023.1Dependencies:Unity 2020.3.16f1BurstMathematicsCollectionsSupported Render Pipelines:Built-inUniversalIt may be used in custom RP (requires a bit of coding to embed impostors into RP)NO OFFICIAL SUPPORT FOR HDRPLightning Limitations:Any count of baked lightsOnly one realtime directional lightNo realtime or mixed non-directional lightsSupported platforms:Every platform that supports render textures, which is almost every platform supported by Unity.WebGL is an exception because it doesn't work with the multithreading Jobs System.Links:DocumentationForum