Skip to content

[HDRP] Improve decal performances when they use different material and the same draw order. #6303

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Nov 25, 2021

Conversation

alelievr
Copy link
Member

@alelievr alelievr commented Nov 16, 2021

Purpose of this PR

Optimize decals for this use case: https://forum.unity.com/threads/decal-projector-performance.965822/

Note that this PR changes the behavior of the order in which decals are rendered when they have the same draw order. This is fine because two decals with the same draw order are not guaranteed to be rendered in a specific order (but the sort is still stable between frames).


Testing status

Initial profiling with 500 decals in an empty scene. Decals are all using a unique material spawned with this script:

        for (int i = 0; i < count; i++)
        {
            var d = GameObject.Instantiate(decal, new Vector3(Random.Range(-radius, radius), 0.5f, Random.Range(-radius, radius)), Quaternion.identity, parent.transform);
            var proj = d.GetComponent<DecalProjector>();
            proj.material = new Material(proj.material);
        }

Decal projector settings are identical for every decal:
image

The decal shader is a ShaderGraph with a simple gradient noise animated based on time.

This is without the fix in CPU profiling:
image

With the fix:
image

As you can see on the CPU side there is a 5x improvement. GPU side is identical since the decal list is the same, only order changes.

Notes for the future

We may benefit from a proper instancing system for decals, meaning that our decals sets will be stored per shader and not per material. This would remove the cost of having to go through the initialization of jobs for every decal material in a scene (this is currently the next big bottleneck on decals). Though that would involve a lot of work since all the ShaderGraph / decal properties would need to be instanced in the shader.

Yamato

https://yamato.cds.internal.unity3d.com/jobs/902-Graphics/tree/hd%252Fimprove-decal-material-perfs/.yamato%252Fall-hdrp.yml%2523PR_HDRP_trunk/9969232/job

@alelievr alelievr self-assigned this Nov 16, 2021
@alelievr alelievr marked this pull request as ready for review November 16, 2021 13:23
@github-actions github-actions bot added the HDRP label Nov 16, 2021
@github-actions
Copy link

Hi! This comment will help you figure out which jobs to run before merging your PR. The suggestions are dynamic based on what files you have changed.
Link to Yamato: https://unity-ci.cds.internal.unity3d.com/project/902/
Search for your PR branch using the search bar at the top, then add the following segment(s) to the end of the URL (you may need multiple tabs depending on how many packages you change)

HDRP
/jobDefinition/.yamato%2Fall-hdrp.yml%23PR_HDRP_trunk
With changes to HDRP packages, you should also run
/jobDefinition/.yamato%2Fall-lightmapping.yml%23PR_Lightmapping_trunk

Depending on the scope of your PR, you may need to run more jobs than what has been suggested. Please speak to your lead or a Graphics SDET (#devs-graphics-automation) if you are unsure.

@alelievr alelievr requested a review from a team November 16, 2021 13:32
@kecho
Copy link
Contributor

kecho commented Nov 16, 2021

Good change!

Copy link
Contributor

@RemyUnity RemyUnity left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ship it !

@sebastienlagarde
Copy link
Contributor

Please, add changelog

@@ -72,6 +72,16 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- Fixed the point distribution for the diffuse denoiser sometimes not being properly intialized.
- Fixed the bad blending between the sun and the clouds (case 1373282).
- Fixed and optimize distance shadowmask fade.
- Fixed compilation errors when using Elipse, Rectangle, Polygon, Checkerboard, RoundedPolygon, RoundedRectangle in a ray tracing shader graph (case 1377610).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please fix changelog

@sebastienlagarde sebastienlagarde merged commit 7e52fda into master Nov 25, 2021
@sebastienlagarde sebastienlagarde deleted the hd/improve-decal-material-perfs branch November 25, 2021 18:07
sebastienlagarde pushed a commit that referenced this pull request Dec 8, 2021
sebastienlagarde added a commit that referenced this pull request Dec 9, 2021
* - Fixed edges and ghosting appearing on shadow matte due to the shadow being black outside the range of the light (case 1371441). #6279

* Fixed interpolation issue with wind orientation (case 1379841). #6284

* Fixed range fields for depth of field #6285

* [Core] Fix XR support in CoreUtils.Drawfullscreen #6287

* ** Fixing DLSS failing when MV are disabled ** (#6292)

* Using texture types instead of RenderTexture types for DLSSPass

* Changelog

* Formatting

Co-authored-by: sebastienlagarde <sebastien@unity3d.com>

* [Fix] Lens Flare visible when being behind a camera with Panini Projection on (case 1370214) (#6293)

* Fix panini for LensFlare

* Add changelog

* Update CHANGELOG.md

* Fixed the ray tracing acceleration structure build marker not being included in the ray tracing stats (case 1379383). #6277

* [HDRP] Remove alpha from local volumetric fog color field #6310

* [HDRP] Changed default numbder of physically based sky bounce from 8 to 3 #6304

* [HDRP] Improve decal performances when they use different material and the same draw order. #6303

* [HDRP] Update reference screenshots #6404

* Fixed Nans happening due to volumetric clouds when the pixel color is perfectly black (case 1379185). #6311

* Fixed missing information in the tooltip of affects smooth surfaces of the ray traced reflections denoiser (case 1376918). #6321

* Physically Based Sky documentation now mentions the warmup cost explicitly (#6323)

* Physically Based Sky documentation now mentions the warmup cost explicitly.

* Update CHANGELOG.md

Co-authored-by: sebastienlagarde <sebastien@unity3d.com>

* Reviewed PR #6031 (#6340)

* Reviewed PR #6031

Also generally improved this doc, fixed typos and added screenshots.

* Apply formatting changes

Co-authored-by: noreply@unity3d.com <noreply@unity3d.com>

* Fix preview scene objects marked dirty by migration #6361

* [HDRP][Path Tracing] Fixed PS5 build compilation warnings #6362

* Fix compil issue

* Apply formatting changes

* Update VisualEnvironment.cs

* Fix HDRP warning (#6396)

* [HDRP][Metal]

* Update reference screenshots sky

Co-authored-by: anisunity <42026998+anisunity@users.noreply.github.com>
Co-authored-by: Adrien de Tocqueville <adrien.tocqueville@unity3d.com>
Co-authored-by: Antoine Lelievre <antoinel@unity3d.com>
Co-authored-by: Kleber Garcia <kleber.garcia@unity3d.com>
Co-authored-by: skhiat <55133890+skhiat@users.noreply.github.com>
Co-authored-by: JulienIgnace-Unity <julien@unity3d.com>
Co-authored-by: Vic Cooper <63712500+Vic-Cooper@users.noreply.github.com>
Co-authored-by: noreply@unity3d.com <noreply@unity3d.com>
Co-authored-by: Arttu Peltonen <77337829+arttu-peltonen@users.noreply.github.com>
Co-authored-by: Emmanuel Turquin <emmanuel@turquin.org>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants