[Bf-committers] UV packing and island margins

Jed Frechette jedfrechette at gmail.com
Thu Mar 21 01:34:54 CET 2013


I'm hoping someone can explain the logic behind how UV island margins are  
handled in Blender. As far as I can tell there are 3 locations where  
island margins can be set to affect UV packing: Pack Islands, Smart UV  
Project, and Lightmap Pack. All three of these handle the user entered  
margin value differently.

I'm still working my way through the code to understand exactly how it  
works but Pack Islands seems to use a different margin for each island  
based on the diagonal of the island's bounding box, the user entered  
margin, and a fudge factor. The final gutter between islands also depends  
on the size of the surrounding islands as they all have their own unique  
margins as well.

Smart UV Project has its own implementation of a similar scheme, however,  
in its implementations all margins end up scaled relative to the size of  
the largest UV island.

In contrast, Lightmap Pack interprets the user entered margin value as a  
fixed percentage of the UV area dimensions.

The first two approaches seem extremely counter intuitive. I don't  
particularly care how big my island margins are relative to the size of  
the islands but I do care how big they are relative to the texture space.  
In that regard, Lightmap seems like it is doing the right thing. If I'm  
planning to use a 2K texture map and know I want a 16 pixel margin I would  
like to be able to enter 16/2048 as the margin and know that is what I'll  
get. You can almost do this with Lightmap Pack, although you have to enter  
1600/2048 because the input margin is divided by 100. I'm not sure if this  
is bug, most other parts of Blenders UI seem to consider values in the  
range 0-1 as representing the range 0-100%, not 0-1% like Lightmap does.

One simple change that would start to unify this area would be replacing  
Smart UV Project's packing code with a call to Pack Islands, I have a  
patch that already does this. One downside to this change is that although  
Smart UV's current packing is very inefficient in terms of texture space  
it is much faster than Pack Islands, something like a factor of 10 in a  
few quick tests I ran. In practice I'm not sure if this is really an  
issue. I usually end up running Smart UV Project, then running Pack  
Islands, then running Pack Islands again because the default margin is not  
what I wanted; so getting a more efficient pack directly out of Smart UV  
would speed things up.

After that changes to Pack Islands could be looked at.

I'm certainly not an expert on these matters so hopefully someone who is  
can correct me if I've made any mistakes or bad assumptions. Given that  
none of this behavior is really documented it seems like it would be  
helpful to make it more consistent and predictable.

Best,

-- 
Jed Frechette


More information about the Bf-committers mailing list