TEXTURE Notecards contain all of your texture references (UUIDs) but they can very quickly become a devils nightmare if you try to manually make one. Instead, we will render a TEXTURE Notecard using the Texture Notecard Export Tool (TNET).
Texture NOTECARD EXPoRT TOOL (TNET)
Before we proceed to instruct the export tool on how textures are organized, rez the tool and place all of your product textures within the tool. Additionally you must include your icons / logos associated with each texture style. All textures must be full perm. Remember that your product will not contain these textures. If you have rendered your product textures from tools such as Substance Painter they will usually have a uniform naming convention. This is advantageous to you later on in this process.
TEXTURE ORGANISATION
Before we look at what we need to do to render a TEXTURE Notecard, we need to understand how textures are treated within the UNIHUD architecture. Each texture is organized into three types of group:
Albedo / Colour
Normal / Bump
Shine
A single group contains 1 or more Textures where each texture corresponds to one UVW Map within the product. This ultimately builds up a "Matrix" of Texture maps like below:
Normal Groups and Shine Groups have a special relationship. Since both kinds of these textures form a material style they are both paired together. However, this pairing is not entirely strict. Since Normal Groups and Shine Groups are optional there are a couple of grouping options based on what your product needs:
No Normal Groups and No Shine Groups
Normal Groups but No Shine Groups
Normal Groups and Shine Groups
Note: The order of the Bump and Shine Groups are important and determine which Shine group is used with which Bump group. That is to say, the first defined Bump Group is paired with the first defined Shine Group.
As you may have already realized, the number of textures dramatically increase per product. Fear not though! This is where the TNET shines saving you hours of manual tedious labour.
JSONTEXTURES Notecard
Another Notecard?! Yes! However this one is a lot more readable. The JsonTextures Notecard is used to hold the details about the organization of your product's textures. Rather than using horrid UUID's, each texture is refereed to by using their file names instead. We can go a step further however with automatic name discovery but we will touch on that later.
If you are not comfortable editing JSON, The UNIHUD System now includes a Visual Editor:
If you like to edit by hand, to avoid any syntax / grammatical errors, It is worth using a JSON Editor like https://jsoneditoronline.org. The example below may seam a little daunting at first but the contents are quite simple.
Full JsonTextures Notecard Example:
{
"project": "Bodysuit",
"bumpGroups": {
"blank": {
"icon": "NORMAL_BLANK",
"names": ["NORMAL_BLANK","NORMAL_BLANK","NORMAL_BLANK","NORMAL_BLANK"]
}
},
"shineGroups": {
"blank": {
"gloss": 255,
"env": 20,
"names": ["$PROJECT $ID AO","$PROJECT $ID AO","$PROJECT $ID AO","$PROJECT $ID AO"]
}
},
"textureGroups": {
"blank": {
"blend": "none",
"icon": "blanker",
"names": ["$PROJECT $ID AO","$PROJECT $ID AO","$PROJECT $ID AO","$PROJECT $ID AO"]
},
"Gold": {
"blend": "none",
"icon": "$GROUP",
"names": ["NULL","NULL","NULL","$PROJECT D $GROUP"]
},
"Silver": {
"blend": "none",
"icon": "$GROUP",
"names": ["NULL","NULL","NULL","$PROJECT D $GROUP"]
},
"Red": {
"blend": "none",
"icon": "$GROUP",
"names": ["$PROJECT A $GROUP","$PROJECT B $GROUP","$PROJECT C $GROUP","$PROJECT D $GROUP"]
},
"White": { "ref": "Red" },
"Anodized Black": {
"blend": "none",
"icon": "$GROUP",
"names": ["$PROJECT A $GROUP","$PROJECT B $GROUP","$PROJECT C $GROUP","$PROJECT D $GROUP"]
},
"Anodized Blue": { "ref": "Anodized Black" }
},
"surfaceAssignments": [
[0, 1, 2, 3],
[0, 1],
[0, 1],
[0],
[1],
[2],
[3],
[3]
]
}
Groups have names for your benefit to keep things organized but they also can be used with OXHEAD to apply that group rather than specify its ID. Groups names also serve an additional purpose within automatic texture name discovery explained further on.
The first common thing that we see is that every group contains a "names" list. This is where each texture name is inserted in the order of the relevant UVW's.
Your model's UVW's are not strictly specified in an order. However you should ensure consistency across the naming of your texture maps if you do use more than one UVW.
I.e. Do not place a texture map relating to UVW 0 in position 0 and then another texture of the same UVW 0 in the next group's position 1.
"names": ["UVW Texture 0","UVW Texture 1","UVW Texture 2","UVW Texture 3"]
In this example, since there are 4 UVW's in the model, there are 4 UVW textures within the list.
There are no UVW limits within the UNIHUD Architecture.
Note: Each groups "names" list must contain the same number of texture names as UVW maps.
Each group is also identified to the user with an icon (with the exception of the Shine Group) and thus its texture name is also stated:
"icon": "PurpleIcon",
As Shine Groups are linked to Normal Groups, they do not have an Icon.
Albedo / Colour Groups can be configured for the kind of alpha blending the textures specifically need:
"blend": "none"
The options available are mask,alpha or none. When mask is selected, the masking cut off threshold is 128 or 0.5.
When defining Shine Groups, you also need to define gloss and environment values:
"gloss": 255,
"env": 20,
These values directly correspond to the values within the SL Editor.
Special Texture Names
Sometimes certain textures do not exist or do not need to exist for a particular product's surface. The TNET however provides special texture names which can act as placeholders or indicate special conditions:
Name | Use |
---|---|
NORMAL_BLANK | Specified when a bump group UVW doesn’t need any bump map detail or needs a blank normal |
TEXTURE_BLANK | Specified when a shine group or albedo / colour group UVW doesn’t need any shine map detail or needs a blank shine |
NO_TEXTURE | A magenta and black checker texture for indicating that a texture doesn’t exist yet for the given group. Use this for Work In Progress testing. |
NULL | Indicate that a UVW is not allow to have a particular texture group applied. Useful for when you explicitly dis-allow a texture to be used on a surface. For example you dont want metal textures being applied to Leather UVWs. |
AUTOMATIC texture Name Discovery
Even with this better way of organizing your product's textures, it is still very much a tedious task having to copy and paste texture names in, especially if you are working into hundreds of rendered textures for your product.
Fortunately, the TNET has another trick up it sleeve.
Instead of literally specifying every texture name wasting away your life (and your keyboard). You can instead describe how texture names are formatted. Taking another look in the full example above, you may have noticed some names with the $ prefix.
These are special parameter identifiers you can describe to the TNET how it should resolve the name of the texture, based on pre-existing information within the JsonTextures Notecard.
Note: Ensure your texture names have a uniform naming convention for this feature to work well!
When the TNET is running, each parameter is substituted for the information provided and then will use that "baked" information to locate the texture. The available parameters are:
Parameter | Substitution Use |
---|---|
$PROJECT | The name of the project entry put at the beginning of the JsonTextures Notecard. |
$ID | The UVW index number of each texture name within the "names" list. This would start at 0 and count up. |
$UDIM | The UDIM value of each texture name within the "names" list. This would start at 1001 and count up. |
$GROUP | The name of the texture group |
Substitution Example:
"project": "Jacket",
"Gold": {
"blend": "none",
"icon": "$GROUP",
"names": ["$PROJECT $GROUP_2D_VIEW_$UDIM","$PROJECT $GROUP_2D_VIEW_$UDIM"]
},
The first thing in this example is that since the icon is also a texture, the name can also be a substitution. Rather than entering the same info twice, here the group name is used instead. The TNET will resolve the icon texture name to "Gold"
Looking at the "names" list, The TNET would resolve both texture names in this list as:
"Jacket Gold_2D_VIEW_1001" "Jacket Gold_2D_VIEW_1002"
If you have multiple texture groups? No big issue! You can define a reference group. This means that it will use all of the details from another fully filled group:
"Red": {
"blend": "none",
"icon": "$GROUP",
"names": ["$PROJECT A $GROUP","$PROJECT B $GROUP","$PROJECT C $GROUP","$PROJECT D $GROUP"]
},
"White": { "ref": "Red" }
If all your textures names follow a naming convention, you'd only need to define one full group and then just list all of your other groups as reference groups!
With this powerful feature, your JsonTextures Notecard becomes the ultimate texture organizational template. This means that although it might take a little more time at first to construct your JsonTextures Notecard, any reuse of it becomes very quick by simply changing the number of entries in a "names" lists for each texture style and, the project name.
Surface Assignments
The final part to your JsonTextures Notecard is expressing which texture (or strictly which UVW Index) is assigned to which surface on your product.
"surfaceAssignments": [
[0, 1, 2, 3], <--- First Surface collection
[1, 1], <--- Second Surface collection
[2, 2],
[3]
]
The surfaceAssignments section is a collection of UVW indices. This might look a little difficult at first but what we really see here is:
For each surface and their respective link face pairs in the SURFACE Notecard, which UVW is associated to each link face pair?
Looking at the First Surface collection, this means that UVW0 is used on the first link face pair, UVW1 is used by the second link face pair and so on and so forth.
The number of UVW Indices in each surface collection must be the same number of link face pairs in each surface in the SURFACE Notecard.
Rendering The Texture Notecard
Once you have built your JsonTextures Notecard, place it in the TNET and then click the TNET.
It will take a moment to read the JsonTextures Notecard and render the TEXTURE Notecard. If there are any errors such as missing textures, it will display them in nearby chat.
When it has rendered the TEXTURE Notecard, it will give you a one time link to the contents of your TEXTURE Notecard. Copy all of the contents into your TEXTURE Notecard and save to your inventory.
Comments