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.


You must log in to comment.

in reply to @pinball's post:

Oh gosh I tried UDIMs before and I found them kinda difficult to work with. Seems like a lot of extra effort especially if the style is more cartoony, at least that's what I figured for my own work.

Also texture map isn't the same as uv map. Texture map specifically refers to something like an image itself used for the purpose of texture mapping. UV map is specifically the data that maps the faces of the mesh to a UV coordinate plane.

yeah it really feels like a lot of the tooling isn't built around using them being a good experience. also as described unity doesn't really support it

also i was unable to find good information to back up the semantics as you described but i edited the post anyway. that part was really more for a high level overview to describe the problem |3

Pinned Tags