Ica Skinned Mesh ✨ Better than Skinned Mesh Renderer (Dual Quaternion Skinning and much more...)

Status: WIP, I’m looking for feedbacks and doing final touches.

Try on Performance Sample on Browser or Windows: Ica Skinned Mesh Renderer Sample by ica-dev

Ica Skinned Mesh

Ica Skinned Mesh is a compute shader based skinner that focused on skinning high quality digital humans.

Its a replacement for the built in “Skinned Mesh Renderer” component, that enables state of the art skinning techniques that used by many AAA games.

:briefcase: When To Use

  • You are working realistic character for games or cinematic projects.
  • Your character model have a lot of blendshapes and reducing performance (10-300+).
  • You want dynamic, physics-driven elements for secondary motion.

:hammer_and_wrench: Dual Quaternion Skinning (DQS) with Scale

Say goodbye to volume loss with DQS, the gold standard for realistic deformation. DQS solve the volume loss issue on skinned meshes, mostly seen at joints. You probably already familiar with DQS since it standard in 3d Modelling applications.

:hammer_and_wrench: Optimized Blend Shape Processing

Process all blend shapes in a single compute shader dispatch, improving performance by 2x to 4x compared to Unity’s built-in Skinned Mesh Renderer, when a lot of blendshapes is active at same time.
Perfect for character models that have high amount of blend shapes.

:hammer_and_wrench: Accurate Normal & Tangent Recalculation

Fix inaccurate lighting caused by multiple blend shapes affecting the same vertex.
Utilizes a compute shader pipeline for runtime recalculation of normals and tangents, ensuring correct results at every frame.

:hammer_and_wrench: Verlet Simulation for Realistic Secondary Motion
Bring life to characters with physics-driven secondary motion for mesh parts.
Based on Verlet integration, providing natural, dynamic movement while maintaining performance.
Easily configurable via vertex colors and stiffness, damping levels to suit your character’s design.

:hammer_and_wrench: Runs Editor time

All IcaSkinnedMesh components works on edit time too, what you see in edit time is what you get in runtime :sunglasses: Also fast play mode options are supported.

:hammer_and_wrench: Attachment Skinner

Attachment Skinner is alternative way of skinning for meshes that meant to follow a base mesh, for example clothing, 3d decals.

It does not use bone or blend shape information, instead an attachment follows their base shape whenever it deforms.

This results much faster computation, for applicable meshes. Also reduces both vram and disk consumption.

Also since it does not required to have weight painting and blend shapes, it simplifies asset creation pipeline significantly.

:rocket: Why Choose This Asset?

  • Built for Performance: IcaSkinnedMesh built high performance from very first iteration, based on experience of author previous DOTS based normal recalculation asset. Its prioritize use of compute shaders whenever algorithms allows, and using DOTS on CPU side.
  • Ongoing Support: Tested with one large-scale project and also used author every day.
  • Non-Disruptive Integration: IcaSkinnedMesh read bone transforms and handles the skinning and rendering part, it does not not interfere with other plugins that work on IK, Animation, Shader etc.

:package: Package Includes

Three Components:

  • IcaSkinnedMeshRendererSystem: process all other IcaRenderers in the scene
  • IcaSkinnedMeshRenderer: Main component of the asset and a replacement for built in SMR. It lives next to disabled built in SMR component and uses its parameter to render the mesh.
  • IcaAttachmentRenderer: Attachment skinner that follows parent IcaSkinnedMeshRenderer

For Advanced Users: There is also helpers assets that also can be used if user wants to

  • A compute shader based 3d Kd tree system.
  • Skinned Mesh Renderer Utils
  • Advanced Mesh Api Utils

:globe_with_meridians: Supported Platforms

  • Compute Shader enabled Platform
  • Might not be suitable for mobile! (This asset focuses delivering high quality visuals, and mobile platform not tested at all)

:gear: Requirements

  • Unity 6000.0.32f or higher

:nerd_face: How It Works

  • At LateUpdate IcaSkinnedMeshSystem iterate all IcaSMR’s.
  • It reads and calculate necessary bone matrices on CPU side via job system, then upload to GPU buffers.
  • Then, a compute shader dispatched for blendshapes, bone skinning, and verlet physics.
  • Another dispatch fired to calculate triangle normals-tangents, then another one vertex normals-tangents.
  • Then mesh rendered by the system.
  • If there are IcaAttachmentRenderers use that IcaSMR, they will be skinned similar to IcaSMR by using 3 compute dispatch.

:warning: Current Caveats

  • 4 Bones per Vertex Only*
  • Mesh index type should be 32 bit*
  • Not all SMR api methods provided in IcaSMR*

(*) Planned to me fixed or improved.

2 Likes

*reserving for FAQ

1 Like

Absolutely valuable asset!

1 Like

What about the store link?

Thanks!

I’m doing final touches and preparing promo images and video, after that I will submit to store, not sure how much it will take to get approved tho.

1 Like

In general, you will get a response from Unity within three weeks. Sometimes with a bit of luck, you can get the results in 10 days!

1 Like

I have a question. Under standard conditions (without many BlendShapes and not very high - precision animations), does the Ica Skinned Mesh still lead the built - in Skinned Mesh Render in terms of performance? If the answer is yes, then the potential of this asset will increase significantly!

1 Like

You can download the windows build at itch io page and try yourself. In my pc at 6 blendshapes they are almost equal (with normal fix), after that IcaSMR become faster, with every new blendshape added gaps widen. Note that on windows build built in smr uses batched compute skinning which is the new tech unity featured in v6000.

1 Like

Great news, really excited of your package!
I see no performance hit with DQS enabled in your demo, always wondered why game engines avoid it like the plague.

1 Like

And the linear performance degradation looks rather threatening. Afraid if it wasn’t for batching or even with cpu skinning.

Hope you’ll manage to do at least 8 soon.

So there’s no fallback to it in runtime?

In your detailed post you’ve mentioned Subsurfaces as a LOD approach, any news in this regard?

Does it reduce VRAM usage by chance? My main concern with blendshapes is that when they overload video memory, the FPS is just being killed. And they do it pretty quickly with 250k tris characters. Chars unique, so not much that GPU batching can do, and the CPU skinning just tanks overall performance down, despite offloading memory.
There’s some impressive improvement in your demo, with dozens of copies of same mesh (btw how much tris?), though in my scenario it’s quite the opposite: up to 4-5 unique characters with dense cage on the screen, maybe 10-20 active and 100-150 overall blendshapes on each. Maybe dynamic stripping of unused blendshapes can help, don’t know if that’s possible though. So do you think there will be some gains?

1 Like

First of all, thanks for your interest.

Batched still dispatch per blend shape, where in IcaSMR all blend shape always use one dispatch.

My end goal is support whatever built in support, but I want to be sure everything is right before adding a new layer of complexity.

You switch in runtime with just enabling/disabling the components, could be useful for lowest level of lod where you don’t use blendshapes

I not working on it right now, one reason is focusing stability of first version of without adding more complexity like I said, another reason is this kind of task would be way more efficient with Mesh Shader, performance and memory wise. Even if it will take 0.2ms on 60k mesh, via compute shaders,
it will take 5x memory. I’m currently writing my own Vulkan/c++ renderer to prototype with mesh shaders and to be reference point for compute performance. But do not expect to happen in near future.

Currently not, VRAM usage will be higher when using IcaSMR. It its caused by the lack of mesh api.
While Unity constantly trying to improve customizability of the rendering part of the graphics,
the geometry part still prehistoric. I know exactly what should I do, but simply no way to do it since,
I hit a the wall when reaching c++ layer where I need to access.

Are you sure it happens because of high vram usage? The bottle-necked by vram capacity and bandwidth are different. When bottleneck by vram capacity graphic resources become allocated from regular ram, which moves data from pci-e bus to gpu core, which has higher latency and slower.
You may guess that’s happening from memory profiler in unity but need to use gpu profiler to be sure.
And unless you fill your scene 4k pbr textures you should not filled vram with that amount of geometry data. Btw use the vertex count when talking about optimizations and not triangle/index count :grin:

1 Like

Also I will update this page to reflect stability and limitations of the IcaSMR better. Last thing that I want to do is giving false promises.

1 Like