Monday, August 10, 2026

How to make UDIM aka fix the iray skin

 This is a old and known issue, from blender 3.3 they changed the way volumes are rendered, as a result the iray skin gets seams where different skin materials meet. This is because, with the new volume shader, we can have only one volume material per object, that wasn't a limitation before. So to avoid the issue we can use UDIM and make one single skin material. Or the alternative is to use the sss skin in the global settings, which doesn't use volumes, but that is approximated and needs to be fixed by hand most of the times, still it's a viable option.

Thomas did a huge amount of work on UDIM and collateral features in the 5.2 version. The main advantages in 5.2 are listed below as a quick overview. This list is limited to UDIM and doesn't include all the other bug fixes and improvements.

1. Merge geografts. We don't need anymore to specify "last udim" when we merge geografts, it is done automatically when needed. This means easy import works fine both with daz geografts and 3rd party geografts. Also a nasty bug is fixed were a countour seam were visible for geografts if exported at base resolution with sharp edges enabled.

2. Merge materials. Now works with geografts, while in previous versions the geografts and the main figure couldn't merge materials as they were treated as separate objetcs. DIMG groups are also fixed, as previously they were unnecessarily duplicated, also preventing to merge materials.

3. Resize textures. It is much more efficient and requires less memory, that's nice for large scenes or complex figures with lots of textures.

4. Bake LIEs. This new tool allows makeups and tatoos using LIEs to be included in the UDIM textures, that wasn't possible before.

5. Make UDIM and overwrite materials. While previously we had a single tool, the new tool is split in two. This allows to make udim textures for all the materials, if we want to. That's useful for example to paint textures in blender. That wasn't possible with the old tool. Then once we make udims we can overwrite the skin materials as before to make a single skin.

With all these bugs fixed and the new features we can now proceed. As example we take Victoria 9 with makeup and the daz genitalia, plus I added the Strix geografts for nipples and navel as we all know G9 doesn't provide geometry definition for them, apart the HD layer. However the steps are the same for any figure. Test scene provided "makeup-9-gen.duf". I assume the reader is familiar with the addon already so I'll not explain every simgle basic step, but rather focus on the new tools.

Beware renderotica is an adult site, so I'd not post the direct link here. Just search for "renderotica strix nipples" on google.

I don't seem to be able to upload files in the blog, other than images, so you can find the example scene on github. Of course you need the daz content installed for it to work.


1. Import the figure.


As a first step we import the figure with easy import as usual. We enable the BSDF materials and the iray skin in the global settings. Now if we render we see the seams where the skin materials meet, as expected. Depending on the specific skin and light conditions the seams can be more or less visible. Below it's Victoria 9 with the default HDRI, not horrible but still visible.



In the uv editor we see that the daz genitalia is placed in the last udim tile, while strix is merged to the body, also the materials are merged with the geografts. We can also see that all the textures are single images, not udim yet.



2. Save and resize textures then bake LIEs.


In blender UDIM need a special name, not compatible with the daz texture names, so we need to "save local textures" when making udims. Eventually we use "set resolution" in the materials panel, to reduce the texture size. The resolution level is the number of times the textures are halved. So for example with resolution 2 we go from 4K to 1K textures. All meshes will affect all the meshes in the scene, otherwise only the selected ones are affected.

Note that this, of course, will not affect the original textures in the daz library.




If the figure is using daz layered images aka LIEs it is mandatory to bake them, otherwise they can't be included in the UDIM textures. If we are unsure we can just run the tool that will bake if there's any, or just do nothing if there isn't.




After the tool is finished, this can be agood time to cleanup our scene, as we generated new textures and blender keeps the old unused data until we cleanup or close and reopen the scene. This is the usual behavior with blender, so we better get used to cleanup every while and then, especially after complex operations.

file > cleanup > purge unused data

3. Make UDIM and overwrite materials.


We now proceed to make udim textures. As a demonstration we make udim for all the materials, it isn't necessary to make a single skin, but it can be useful for painting in blender, and works fine to make a single skin anyway, so it's a win win.

It is essential to select the head material as active, as it includes the makeup and will be used as template. The "image size" is used to generate images to fill the udim, should any udim tile be missing in the daz textures. Then "combine texture types" will fit udims when a single texture is used with multiple color spaces, otherwise textures with different color spaces are duplicated, it is more a debug option can be always on.

In the image editor we now see the textures are all udims.







Again we can cleanup after making udims to purge memory from the old textures.

file > cleanup > purge unused data

Note. Making udims for all materials is complex, as the daz textures are not always compatible with UDIM, so the addon uses some heuristics to fit them. But the result is usually quite good. Nevertheless, if we encounter oddities in the UDIM textures, we can opt to only turn into UDIM the skin textures we're interested in. This works as the old tool and it is safer.

bug. Personally I get a bug for tiles 1005 1006 in the Victoria normal map, where extra tiles are generated but not filled. This bug Thomas can't reproduce it works fine on his system, so if you encounter the bug please let us know.

To fix this is easy though, we select the 1005 1006 tiles and "fill tile" with the neutral normal map color rgb(0.5,0.5,1.0), this is what the addon should do itself.




Now we can "overwrite materials", that means all the skin materials we select will be overwritten by the active material, again it is important to select the head as active to preserve the makeup. We can eventually exclude the fingernails if we want to keep them as a separate material.

We see the seams are gone as the skin is a single material.







Diffeomorphic Add-ons Version 5.2.0 Released

Version 5.2.0 of the DAZ Importer, MHX Runtime System and BVH and FBX Retargeter have been released. They can be downloaded from

DAZ Importer: 
https://www.dropbox.com/scl/fi/30jlo03jzd5a3fq647efc/import_daz-5.2.0.zip?rlkey=wp2ku7h4c16lq8kabxe62gt8b&st=gf09ki3v

MHX Runtime System: 
https://www.dropbox.com/scl/fi/swl13odwoqd0eu7a39avt/mhx_rts-5.2.0.zip?rlkey=8f7kypxv52vhleoy3rjns43vc&st=cfh6d9oc

BVH and FBX Retargeter: 
https://www.dropbox.com/scl/fi/sl5vlvnc5xza4bpi71kad/retarget_bvh-5.2.0.zip?rlkey=sn3bkdsn77eryl5qxzu1y16gt&st=49d3cold

The add-ons have been tested on Blender 3.6 and 5.2. They should run on Blender versions from 3.0 onwards.

The main reason for this release is compatibility with Blender 5.2. There are also various bug fixes.

Tuesday, July 14, 2026

DAZ vs JSON Favorites

 There are two ways to import favorite morphs into Blender. The first is to mark morphs as favorites in DAZ Studio and easy import them into Blender with the "DAZ Favorites" option enabled. But there is also a second method, where we first save a list of morphs as a json file. These morphs are then imported if we enable another easy import option, which was just called "Use Favorite Morphs", and were described in  Favorite Morphs and Easy Import.

It is unfortunate that two such similar but distinct options have so similar names. There were historical reasons for that, but it is easy to confuse the two types of favorites. To reduce confusion the type of favorites saved in a json file are now renamed to "JSON Favorites". The two types of favorites appear both in the morphs panel and in the easy import options.

Let us start with the DAZ favorites. In DAZ Studio we mark some morphs as favorites by pressing the heart-shaped icon. Here we have Genesis 8 Female with Golden Palace Gens and Headlights, and we make favorite morphs both for the base figure and the geografts. One of the main uses of favorite morphs, of both types, is to ensure that custom morphs are imported to geografts during easy import, before they are merged with the main figure.
Notice that the Nipple Inflate and Nipple Flatten 1 morphs are favorites for both the left and right Headlight.

 Enable the "DAZ Favorites" option in easy import.
The same morphs now appear in the custom morphs panel. Nipple Flatten 1 and Nipple Inflate appear in both the left and right headlights subpanels, and as we can see the sliders can be dialled independently.
After merging the grafts to the main mesh we can see all shapekeys. The names of the nipple shapekeys are qualified with the mesh name, to make them distinct.
Now we turn to JSON favorites. Import custom morphs to the main figure as well as the various geografts. This must clearly be done before the grafts are merged. Once all morphs are imported, select the meshes we want to include and press "Save JSON Favorites".
Here we specify the json file to save. If the "Compact View" option is enabled, the json file contains one line for each custom morphs panel. If it is disabled, there is one line for each morph. This can make the file very long, but is better for Manual Editing of Favorite Morphs.

The json file looks like this (in compact view).

Once we have a json file with favorite morphs, we can use it to import the same set of morphs to all characters of a given type (typically the same base figure and the same geografts). 

To import a daz file with json favorites, first select the json file in the main panel, right below the "Easy Import" button. The easiest way to do that is to press the folder icon to the right and navigate to the json file.
The "JSON Favorites" option is now enabled and the json file is selected. However, here the file path is just an ordinary string, and there is no folder icon to the right. It appears to be a Blender limitation that we can not launch a second file selector from within another one.

The favorite morphs now appear in the custom morphs panel, in the same way as for DAZ favorites.

Monday, April 20, 2026

SINGLE HD MAP

The addon already provides tools to bake HD figures, so this is just an alternative setup, easy to do by hand. The advantage is this way we use a single texture, and we don't have to save local textures as required by the built-in tools. We will use as example Victoria 8 HD.

This is a general method we can use with any multires, not only daz figures. We assume the reader is familiar with the basic blender tools so this is not a step by step tutorial.

step 1. HD uv map. First we create a new uv map for the HD texture, where all the figure uvs are in the first udim. For this it is enough to create a new uv map, then go to the uv editor and pack islands. Eventually we can also scale some islands to better fit the uv space. Below we see the Victoria 8 uv map packed nicely into the first udim.

edit mode: uv editor > uv > pack islands


step 2. HD texture. Then we create a new texture to bake to, first we create the image texture then the image for the texture. It is important to place this texture as selected in all the figure materials, so cycles knows it has to bake everything there. Note that we use the HD uv map for the texture, also we set the color space as non-color as this will be a normal map, but it's the same if we want to bake a displacement.


step 3. Bake. With the new texture in place and selected for all materials, we can now tell cycles to bake the multires. Below the settings I used. The baking process takes just a few seconds in a mid-level PC.

render properties > bake


step 4. Assign the HD texture. Now we have the normal map baked from multires, we can save the image then connect the texture to the bump node in all the materials. Note that the texture is the same for all the materials and it uses the HD uv map. Of course we can disable then delete the multires modifier as we don't need it anymore having it baked.

Yes it's that simple. The main annoyance is we have to connect the texture by hand for all the materials in the figure.



Saturday, April 4, 2026

Moving to GitHub

Atlassian has decided to sunset Bitbucket issues and wikis by August 20, 2026 (https://community.atlassian.com/forums/Bitbucket-articles/Announcing-sunset-of-Bitbucket-Issues-and-Wikis/ba-p/3193882). This means that the Diffeomorphic addons have to move before that. Atlassian suggests that one should use their JIRA software, but I don't know anything about JIRA and it looks really intimidating. Since staying on Bitbucket without a wiki and a bug tracker is not an option, I decided to migrate to GitHub instead. Most other open source projects seem to be hosted there, so it is probably a better place to be anyway. The stable releases on Dropbox are not affected by this migration.

The new repos are thus

I have managed to move the wikis to GitHub. It is still the same old and partly obsolete documentation, but at least it will live past August 20. 

The bug tracker will also be removed on August 20. New bugs should be reported at

Issues with the MHX RTS and BVH Retargeter should also be reported there, because I don't have the bandwidth to monitor several sites regularly. Old issues are still available as static web pages which can be downloaded from

Thanks to GeneralProtectionFault for scraping the old tracker. 

Saturday, March 21, 2026

Diffeomorphic Add-ons Version 5.1.0 Released

 Version 5.1.0 of the DAZ Importer, MHX Runtime System and BVH and FBX Retargeter have been released. They can be downloaded from

DAZ Importer: 
https://www.dropbox.com/scl/fi/xhzuuk8b7ljc9q6e82elh/import_daz-5.1.0.zip?rlkey=dne3g99ooizo6oq5jx3w4owln&st=7jghklqg

MHX Runtime System: 
https://www.dropbox.com/scl/fi/op24pkdexyvrp5jnu7gae/mhx_rts-5.1.0.zip?rlkey=y3zsymz5duukmgxwmfbfjzwc2&st=uezatm0b

BVH and FBX Retargeter: 
https://www.dropbox.com/scl/fi/qozj9a8jfidcwjwo4g0xf/retarget_bvh-5.1.0.zip?rlkey=0aabdno78nxq7byl7fe16mqj6&st=a3aeo55q

The add-ons have been tested on Blender 3.6 and 5.1. They should run on Blender versions from 3.0 onwards.

The main reason for this release is compatibility with Blender 5.1. Apart from various bug fixes, performance has also been improved, as announced here.

Monday, February 23, 2026

Performance Boost

I recently learned about the foreach_get and foreach_set functions that makes access to Blender arrays much faster. The latest versions of the Daz Importer (5.1.0) use these functions to loop over vertices, shapekeys, polygons etc. This had led to a quite nice performance boost.

A a test case I import a Genesis 9 Female character with eyebrows card style 06 and dForce Pixie cut hair. All global settings were set to the factory values (except the DAZ root paths), and the Genesis 9 preset was used for Easy import. I imported the character twice and hit ctrl-Z inbetween. Here are the results.

Blender 4.4:
addon 5.1:    39.398 seconds    37.200 seconds
addon 5.0:    75.642 seconds    75.424 seconds
addon 4.4:    70.669 seconds    70.991 seconds

Blender 5.0:
addon 5.1:    34.721 seconds    35.120 seconds
addon 5.0:    85.280 seconds    77.256 seconds

Blender 5.1 beta:
addon 5.1:    60.276 seconds    60.069 seconds

Notes:

1. The addon is backward but not forward compatible. Newer versions of the addon can be used in old blender versions, but not vice versa.

2. Version 5.1 (development version) of the addon is significantly faster than version 5.0.

3. Blender 5.1 beta is slower than previous Blender versions. This probably only reflects that a beta is not as optimized as a proper release.

The old method of loading shapekeys used to loop over the nonzero shapekeys in Blender, whereas the new method uses foreach_set to copy a numpy array in one sweep. However, for small morphs like the FACS, i.e. morphs that a localized to a small part of the full mesh, the old method may actually be faster. A python loop is much slower than the builtin method, but it only needs to access the nonzero shapekeys. For example, for the first Genesis 9 FACS morph, facs_bs_BrowDownLeft:
Mesh size:       25182
Morph size:     661
In that case the slow python loop is actually faster than using numpy.

For this reason, there is a new global setting, "Numpy Morph Fraction". The old method is used if the shapekey size (i.e. the number of nonzero deltas) is smaller than this fraction, otherwise the new method is used.