# Blending materials for more gooder colours

## The Problem

The selection of materials and the available colours for each material in Cyberpunk 2077 is very limited and often underwhelming. The colours the game offers by default lack saturation and are usually either too light or too dark. The way of getting around this is layering different materials of different colours at varying opacity.

## The Preparation

**The Tools**

* [WolvenKit ](https://github.com/WolvenKit/Wolvenkit/)- setup instructions [here](https://wiki.redmodding.org/wolvenkit/getting-started/download)
* [MLSETUP Builder](https://github.com/Neurolinked/MlsetupBuilder) - setup instructions [here](https://wiki.redmodding.org/cyberpunk-2077-modding/for-mod-creators/modding-tools/mlsetup-builder), from here on out referred to as MLSB
* [Red Hot Tools](https://github.com/psiberx/cp2077-red-hot-tools/) - setup instructions [here](https://wiki.redmodding.org/cyberpunk-2077-modding/for-mod-creators/modding-tools/redhottools)
* [Equipment-EX](https://www.nexusmods.com/cyberpunk2077/mods/6945)
* [Photoshop](https://www.adobe.com/products/photoshop.html) (or another image editor of your choice if you need to edit an `.mlmask`)
* [Blender](https://www.blender.org/) (if you want to create an `.mlmask` from scratch)

For this to work properly, you need two layers inside the `.mlmask`, each of which needs to cover the same part of your `.mesh` you want to change. The lower layer needs to be pure white, the other one on top of that at 50% grey (`rgb(50%,50%,50%)`). This way, the materials of each layer will blend into each other allowing *much* greater control over shade, brightness, saturation, and shininess.

If your blue denim lacks saturation, slap a second layer on top of it. Give that second layer the same material and colour and both will amplify each other.

The default `.mlmask` found inside your `.mesh` might already contain the layers described above. If not, you'll likely get away with editing the layers in Photoshop. To learn more about `.mlmask` files go [here](https://wiki.redmodding.org/cyberpunk-2077-modding/for-mod-creators/materials/multilayered#what-is-the-mlmask) and to learn how to create one yourself using Blender, go [here](https://wiki.redmodding.org/cyberpunk-2077-modding/for-mod-creators/modding-guides/textures-and-luts/custom-multilayermasks).

## The Colour

For a specific example, we'll try to get yellow to look nice as I find yellow to be one of the more finicky colours to get to look "correct" within Cyberpunks shader. Here, I'm using `velvet_clean_01_30` with `rgb(77%,22%,8%)` as the base and `latex_neon_01_30` with `rgb(100%,100%,0%)` on top of it. By itself,`velvet_clean_01_30` lacks saturation and its selection of yellows is very limited. `latex_neon_01_30` on the other hand includes a pretty decent shade of yellow, but also lacks saturation—even though the name implies the opposite. I find that Cyberpunks shader often renders yellows to be more green than I'd expect them to be. Which is why I'm using an orange base layer.

<table data-full-width="false"><thead><tr><th align="center">velvet_clean_01_30 by itself</th><th align="center">latex_neon_01_30 by itself</th><th align="center">together</th></tr></thead><tbody><tr><td align="center"><img src="https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-d0de502da7529470236dc64ae2b8c732f7316db7%2FCyberpunk2077%202024-05-29%2000-26-27.png?alt=media" alt=""></td><td align="center"><img src="https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-331caacfee68de3e577f53573d01364332c9c9f9%2FCyberpunk2077%202024-05-29%2000-27-02.png?alt=media" alt=""></td><td align="center"><img src="https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-929a86320ca0255634d913b3b11120d21acfe4f4%2FCyberpunk2077%202024-05-29%2000-27-54.png?alt=media" alt=""></td></tr></tbody></table>

## The Texture

This method of layering materials unfortunately drastically reduces the effect of the `normals` of each material. `normals` become "filled in" the more of them you stack. A workaround is to mis-appropriate a materials `normals` as a `microblend` for another material.

1. Copy the path of the `.mltemplate` of a material whose texture you want to use from MLSB.
2. Paste the path into WolvenKits Asset Browser and hit `Enter` to search.
3. Right click on the `.mltemplate` and select "Open without adding to project".
4. Copy the `DepotPath` of the `normalTexture` and paste it into the `µblends` field in MLSB.
5. In the µblends Parameters box, you can mess around with its size (`Tiles`, higher number means smaller texture—it gets tiled more often across the same surface area), opacity (`contrast`) and intensity (`normals`, can be higher than `1`).

<div data-full-width="false"><figure><img src="https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-eff6cfd1948fd407015d85632f3b4044a1068dbe%2Fmltemplate_to_n_xbm.png?alt=media" alt=""><figcaption><p>using cotton_twill_clean_01_30_n.xbm as a microblend</p></figcaption></figure></div>

<figure><img src="https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-a1d742de31a6c3dba05b558c72697f68e10fc953%2FCyberpunk2077%202024-05-29%2000-25-22.png?alt=media" alt=""><figcaption><p>cotton_twill_clean_01_30_n.xbm in-game</p></figcaption></figure>

`normals` of `µblends` can also be inverted by setting their intensity to a negative number. this will, for example, turn a relief from pointing outwards to pointing inwards. This is sometimes necessary when using the `normals` from an `mltemplate` as a `µblend`, but creative choice takes precendence, of course.

| µblend normals at 1.0                                                                                                                                                                                                           | µblend normals at -1.0                                                                                                                                                                                                          |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ![](https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-e0e01b512ea0db2eeb1586eb3337e88ec5add27d%2Fnormal_positive.png?alt=media)                  | ![](https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-7c687b4a9fb1ce9448de5633829c2eed5f5a26f6%2Fnormal_negative.png?alt=media)                  |
| ![](https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-47b8dbdf02d91f27d919918bc5f595d7ee78e4c0%2FScreenshot%202024-09-22%20154016.png?alt=media) | ![](https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-fa382f44427b85cce33545118b0e683ad494c66f%2FScreenshot%202024-09-22%20154006.png?alt=media) |

## The Opacity

Cyberpunk allows layers in your `mlsetup` to exceed `Opacity 1.0`. What this does is amplify your current layer. This is very useful for camouflage materials such as `denim_camo_01_30`. This material looks faint and lacks saturation by default. This can be mitigated by setting the `Opacity` to `3.0`. For `denim_camo_01_30` I'd also recommend using olive green as the base colour for your camo layer in the `mlsetup`.

<figure><img src="https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-99b3ff279aae96dad3139abff938c1c23e7e937e%2FScreenshot%202024-09-22%20150310.png?alt=media" alt=""><figcaption><p>denim_camo_01_30 at Opacity 3 to enhance colour and pattern. Normals set to undefined. Texture intensity is controlled via µblend.</p></figcaption></figure>

| ↓ Green base, opacity 3.0                                                                                                                                                                                     | ↓ Green base, opacity 1.0                                                                                                                                                                                     |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ![](https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-0c7c0422932984338d2269bd014e58652ee676ab%2Fcamo_green_3-0.png?alt=media) | ![](https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-d5ecf239c3caa08553ea1654191b5ec1d22f8071%2Fcamo_green_1-0.png?alt=media) |
| ↓ Grey base, opacity 3.0                                                                                                                                                                                      | ↓ Grey base, opacity 1.0                                                                                                                                                                                      |
| ![](https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-d09bdc75a8f84807b8c3236c076ec53aa06d28de%2Fcamo_grey_3-0.png?alt=media)  | ![](https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-c87060fc4f12b557e55cc6037076d367485be36e%2Fcamo_grey_1-0.png?alt=media)  |

## The Shininess

This tutorial won't go into the technical details of how reflections and roughness work (mainly because I don't get it myself), but for more information, see [here](https://wiki.redmodding.org/cyberpunk-2077-modding/for-mod-creators/materials/configuring-materials#shared-properties). Shininess is mainly controlled through the Rough Out value in MLSB. The dropdown contains a list of properties inherent to each material.

<figure><img src="https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-3d59f7a8a025a08cff5e76ad3eb0c979566bbd23%2FScreenshot%202024-06-01%20201527.png?alt=media" alt=""><figcaption></figcaption></figure>

If you want your material to be matte, pick a value where the two numbers are roughly equal. For `velvet_clean_01_30` this would be `0.502,0.498`. This might end up looking a bit flat though. An alternative with more depth would be `0.1569,0.8431`.

<table data-full-width="false"><thead><tr><th align="center">velvet_clean_01_30 @ 0.502,0.498</th><th align="center">velvet_clean_01_30 @ 0.1569,0.8431</th></tr></thead><tbody><tr><td align="center"><img src="https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-83dc299f2f2b8dd734d673598b9238c086b6df89%2Fvelvet_clean_01_30_502_498.png?alt=media" alt="" data-size="original"></td><td align="center"><img src="https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-ec123e0e72b9ccd31fa1e071733a1ea50c79aa2f%2Fvelvet_clean_01_30_1569_8431.png?alt=media" alt="" data-size="original"></td></tr></tbody></table>

If you want your material to be very shiny, pick a value where the first number is low, and the second is zero.

<figure><img src="https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-cb538858e6822c6a87fbb91b22e1c960d2febad5%2Fvelvet_clean_01_30_1373_0.png?alt=media" alt=""><figcaption><p>velvet_clean_01_30 with Roughness Out set to 0.1373,0.0</p></figcaption></figure>

Confusingly, the opposite might be true, as well. In the following example, `0.6667,0.3333` is shinier than `0.3333,0.6667`. It's quite illustrative of the interaction between the two numbers because they're the exact opposites.

|                                                                                            velvet\_clean\_01\_30 @ 0.6667,0.3333                                                                                            |                                                                                            velvet\_clean\_01\_30 @ 0.3333,0.6667                                                                                            |
| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| ![](https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-f797cde7064ab684a5acd5596c797ab03a1bbb93%2Fvelvet_clean_01_30_6667_3333.png?alt=media) | ![](https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-ebbee9d0e5ae946bb2a15e474ff8d93294c2e61d%2Fvelvet_clean_01_30_3333_6667.png?alt=media) |

## The Versatility

Most of my `mlsetups` bascially exclusively contain layers of `velvet_clean_01_30` or a similar cloth material with different `µblends`. Exceptions are `latex_neon_01_30` for anything yellow as described above, and any metals. Although you can colourise those with an additional layer of `velvet_clean_01_30`.

| Item                                                                                                                                                                                                                                 | MLSB Screenshot                                                                                                                                                                                                                 |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ![](https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-b20b846dc80b711827e62eaf0d85ffd3747c7ecf%2FCyberpunk2077%202024-09-22%2015-15-34.png?alt=media) | ![](https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-e010200aed5932968ff2f50e7b242bc5b1355eda%2FScreenshot%202024-09-22%20145959.png?alt=media) |
| ![](https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-35009e45ac5f0511a8d4028d103fc73287ef0331%2FCyberpunk2077%202024-09-22%2015-17-32.png?alt=media) | ![](https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-1f0b5c140bf94404f8b3e63b7b79408317e0c9b6%2FScreenshot%202024-09-22%20150153.png?alt=media) |
| ![](https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-13c712889e04bc8cb44162b4dc5db6c72a481a82%2FCyberpunk2077%202024-09-22%2015-44-40.png?alt=media) | ![](https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-894e07d08b32a638110d1029b7e9b08b85a0bfc5%2FScreenshot%202024-09-22%20161255.png?alt=media) |

## Microblends (μblend)

Microblends interact with the multilayer mask levels in order to paint patterns or additional textures into the material. In the below example there is a two by two grid differing by microblend contrast. These 4 grids are further sub divided up into 16 grids which are levels of the multilayer mask.\
At high contrast levels the full range of the microblend is used and then multiplied with the multilayer level to give transparency or opacity. At low contrast levels, the microblend is truncated at the high and low parts of the blend texture, and then the pattern is painted with opacity or transparency.

<figure><img src="https://1427525421-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4gzcGtLrr90pVjAWVdTc%2Fuploads%2Fgit-blob-42df2a2c9c646668cc457a26d55892f9b300965e%2Fmicroblend.png?alt=media" alt=""><figcaption><p>ublend contrast 0.25 / ublend contrast 0.5<br>ublend contrast 0.75 / ublend contrast 1.0</p></figcaption></figure>

## The Outro

Once you've found material-colour-texture-shininess combinations you like, I'd recommend writing them down somehwere to be re-used across your mods. Good starting points for base materials are `velvet_clean_01_30`, `spandex_clean_01_30`, and `nylon_metallic_01_30`. All of these are very versatile because they offer a broad range of colours and levels of shininess. The first two of those also work very well as materials to be used on the top layer. `canvas_clean_01_30` and `denim_clean_01_30` have lovely textures. For reference, [this page](https://wiki.redmodding.org/cyberpunk-2077-modding/for-mod-creators/materials/multilayered/multilayered-previews) contains previews for *all* materials available in Cyberpunks shader. There's also a downloadable `.zip` in there which is useful to keep on hand when you're messing with materials.

{% hint style="info" %}
If you create your own material combinations, expect a lot of trial and error and bring a lot of patience.
{% endhint %}

## The Addendum

To quickly check how your changes look in-game, you can use [Red Hot Tools](https://github.com/psiberx/cp2077-red-hot-tools/).

1. Create an outfit using your item, save it with [Equipment-EX](https://www.nexusmods.com/cyberpunk2077/mods/6945) and **un-equip** it
2. Enter Photo Mode, `Alt + Tab` over to MLSB, and make some changes.
3. Export the `.json` and import the `.mlsetup` in WolvenKit. Click on "Hot Reload" in the toolbar.
4. Switch back to the game and, while still in Photo Mode, switch to your saved outfit.
5. Your changes should show up on your item. Switch back to **no outfit** again, make more changes in MLSB, export, import, Hot Reload, rinse and repeat.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wiki.redmodding.org/cyberpunk-2077-modding/for-mod-creators-theory/materials/multilayered/blending-materials-for-more-gooder-colours.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
