Submeshes, Materials and Chunks

How (and why) to split up meshes


Why are submeshes?

In Cyberpunk, you can assign one material per submesh.

Material assignment is done in the .mesh file's appearances array via chunkMaterials.

The chunkMaterial entries correspond to material entry names.

At first, this seems a bit counter-intuitive, but keep in mind that Cyberpunk's entire material system is geared for flexibility. By altering a single submesh material, a black Arasaka helmet with red lights and a Hello Kitty hologram can become a black Militech helmet with red lights and a Hello Kitty hologram!

To learn how materials work, check the parent page: 3d objects: .mesh files

Example: the more detailed explanation

Our fictional helmet appearance uses the materials helmet_mlsetup_black, visor_dark, hologram_hellokitty, decals_arasaka and emissive_tubes_red. There are at least three more materials / variants defined for every possible slot, but the default appearance is a black helmet with red lights, Arasaka decals, and a Hello Kitty face projected on its black visor. Or in short: major-league professional tactical gear.

Submesh 0 is the main body of the helmet. It uses a multilayered material (something incredibly cool and tech-y, no doubt). The default helmet is black, but by re-using the same .mlmask, different colour schemes can easily be created with different .mlsetups.

Submesh 1 is the visor. It uses a glass shader. There's also a transparent version, but this appearance isn't using it.

Submesh 2 is a decal โ€” a hologram projected on the visor. This one uses hello_kitty. Alternative appearances use Venom and Pacman. (Or whatever else you can dream of)

Submesh 3 are the regular decals - for this appearance, Arasaka style.

Submesh 4 are emissive tubes โ€” they come in red, white, and blue.

Submeshes in Blender

In Blender, our helmet would look like this:

You can create more submeshes by splitting off parts of a mesh, and incrementing the submesh index.


You want red and blue glowing tubes on the example helmet.

  1. Split parts of submesh_04_LOD_1 into submesh_04_LOD_1.001

  2. Re-name submesh_04_LOD_1.001 to submesh_05_LOD_1

  3. Export the new geometry and import it into Wolvenkit

  4. Your mesh will now have six submeshes instead of its previous five

  5. For each appearance that you have defined, add a chunkMaterial entry. If you skip this step, the new submesh will have no material assigned, and be invisible.

Chunkmasks: partially hiding meshes

Imagine you want to hide the helmet's glowing parts (because you are being stealthy). You could just define another appearance where the glowing tubes are turned off โ€” but you would have to add one for every variant you make. arasaka_hellokitty_glow and arasaka_hellokitty_noglow, the same for Militech, NightCorps and NCPDโ€ฆ ain't nobody got time for this.

That's why CDPR came up with chunkmasks.

The mesh is loaded via component in an .ent or .app file. Here, you will find the chunkMask attribute, which looks like this:

The numbers in the dropdown correspond to the submeshes: unchecking an entry will hide it, regardless of the assigned materials.

How to see chunkmasks in-game?

You have two options, (for NPCs, including V) and RedHotTools.


You can download Appearance Creator Mod on Nexus. It requires Codeware, Cyber Engine Tweaks, and all of their requirements.

With ACM installed, make sure that the target is under the cursor in the middle of the screen (you can use photo mode to look at V). Then, find the correct mesh/component in the UI and click on the correct button:


Last updated