i will now ramble at you with no photos because it is about 7am about what i've learned tonight, but with some primer first for anyone not super up on how textures go on 3d models.
meow.
some background:
a mesh is a collection of vericies that connect to make faces which render in some way, making an object appear in 3d space.
to put a texture on that object, each vertex contains not just its x y and z coordinates in 3d space, but also a u (horizontal) and v (vertical) coordinate pair (a decimal between 0 and 1) that map that vertex to a point on a material which has a texture (and can have a bunch of other stuff). the process of making this make sense is texture mapping, the end result of which produces a uv map.
a problem:
how many pixels are afforded to different faces in the uv map varies, and faces which cover more space will need more pixels for it to look consistent. however models often have areas with high detail and areas with low detail, so if you want high detail in various areas you might end up with a lot of very high resolution textures
a solution:
UDIM (or U DIMension) makes tiles beyond the bounds of your usual uv map. So if your usual uv map has u and v between 0 and 1, the tile to the right of it increases the u by one, and u has a range of 1-2 and v of 0-1. The tile to the right of that has u 2-3, v 0-1. The row above adds to v in the same way.
the idea here is then that you can assign different, smaller resolution textures to parts of your mesh you've uv mapped if they don't require high detail, saving on space.
enter unity:
in unity you give a mesh renderer script a mesh and materials to apply to that mesh. the materials each have a shader which takes inputs and textures and helps combine it all together to make the thing appear on screen as it should.
unity does not support UDIM, at least not the Standard shader. shaders written for unity need to define their texture slots beforehand, so it's not possible to load a dynamic number of textures based on the mesh information inside the material.
however it is possible for a shader to have a defined set of tiles it will look for to handle in some way, such as loading different textures to different areas.
then poiyomi:
poiyomi is a specific shader primarily intended for use in vrchat.
poiyomi does not allow loading different textures into uv areas defined on different tiles, but it does allow for discarding mesh areas during rendering based on it. specifically it has toggles to permit discarding a 4x4 grid of tiles, from 0-0 to 3-3
each of these toggles can be animated at runtime
and so in vrchat:
faces of a mesh that have had its uv moved to different tiles can be dynamically discarded from rendering, which is a performance increase, but since there are so many toggles available you can make complex combinations or just simple item toggles.
this saves on vram because before one might have accomplished this effect for a single toggle per material using an alpha mask which is another texture to load into the shader
it also saves on vram and some CPU time as compared to using a shape key/blendshape (think keyframe that tweens verticies between two set points based on its value between 0 and 1 (or 0 to 100 in Unity)) which might have been used to accomplish this effect for multiple toggles
alas:
a blendshape is shown as part of animations to users who may not be showing your custom shader (poiyomi is a custom shader), it's also more versatile than simple on/off and there's not an arbitrary 16 toggle limit, nor does it lock you into a single shader, so it is probably still the best choice.
setting this up looks weird in blender, the tools to work with uv maps set up this way feel weird too if you need to make changes, it requires changes to the mesh which if you're making a clothing DLC you probably cannot reasonably make for end users, and the performance gains are as yet unknown
and yet:
i'll probably still play with it on my own models, and the soapcats i'm making going forward, since combining this method with a shape key gives i think the best results in some cases.

