Make hair rendered as objects inherit the texture color of the emitter?

Try as I might to figure out my own issues and sift through a multitude of different threads and posts for answers, I always end up back here.

I have a setup on my cat here where its fur is rendered as objects (in this case, planes with a fur texture) to achieve a stylized look. I would like the fur planes to inherit the color of the texture directly beneath where they’re being emitted from, like real fur.

Initially, I found others with a similar problem (however, typically from posts 7+ years ago) that had their issue solved by a Texture Coordinate node with the emitter selected as the object and having the respective noodle plugged into a Mapping node, which was then plugged into the vector of the image texture desired on the fur, like this:
image
Little to no adjustments needed! Done, done, and done!

However, this is not the case for me. I’ll attach my Blend file, but I’ll also do my best to explain. I’ve also made a sample texture for demonstration, featuring some squigglies on the back and flank as well as an X on each shoulder/thigh.

First off, many adjustments are needed with the texture mapping, and I’m able to get it pretty close, which would be perfectly fine it didn’t seemingly eat the textures on the side of the cat…

As you can see, only the squiggly at the top is there, whereas the others aren’t being shown on the fur (but are still there on the object itself).

After some experimenting, it seems like its only projecting the texture from the top view for some reason?? Because if I draw something near the top of the flank but have it still be visible from the top-down, it’ll show up but stretch itself across the entire side.

What’s going wrong here? I haven’t seen anyone else with this issue yet, at least not in this context and usually not with EEVEE. Played and experimented with as many things as I could think of but yielded no helpful results.

Also, strangely enough, the texture seems to be perfectly a-okay if I use a generated one such as a checker or noise texture rather than my own image.

My Blend file

Well it is a mapping issue. The problem is that texture paint (and your cats body material) are using UV cords, but your fur particles are using obect cords (of the cat object).

You can not mix 2 coordinate systems like that.
Object cords are 3d coordinates but your image texture is 2d, that is why you can project on the z axis but not on the sides.

It is similar to using object cords for a brick texture, the texture maps on XY from the top and bottom but stretches on the z axis.

If you change the y location on the fur particle material you can get the pattern to show dark blue “stretched” lines on the sides.

It is a similar problem as this:

The brick texture is 2d (it only has x y) info so it stretches on the z axis with object cords that do have z info.

Unfortunately you can not use texture paint with object cords, Blenders texture paint needs UV’s. I am not sure of a work around for this I will investigate but it seems like a catch 22.

You can use object cords to map a 3d texture (eg noise) but not properly a 2d image.

Or noise and wave texture (just playing- sorry)

As you want to paint it the only thing that occurs to me would be to apply the particle system and some how transfer the UV’s to the applied faces, but that would lead to a whole world of new problems when you want to pose and animate the cat. I do not think it would work out.

2 Likes

oh good lord, this is gonna be a lot more complicated than I anticipated then. You’d think Blender would be able to figure this out!

My original thought process was “Is there a way to tell the edges/vertices nearest to the emitter to take the color its closest to and spread that across the whole face?”, I was thinking that surely by now there’d be some setup for that. Surely I can’t be the only one faced with this problem?

My current absolutely buck wild theory is to flatten out the model so it matches its UV map but now in the 3D space (probably with geometry nodes), get the fur onto that, and then project the texture onto that so its no longer battling the Z axis. Probably have the flattened out version as the basis shape key and then another one that keeps the model constructed properly that’s always on.

However, I have absolutely NO IDEA if that would work or how I could even get that set up (though I do have a vague idea of how I could start, if push comes to shove), and even if I could, I’m sure that’d just cause so many more headaches and inconveniences in the least expected ways.

I’d very much like to keep that as a last resort, though, and try to explore much simpler solutions. I wonder if anyone’s tried what I thought about first?

I think you might be looking for From Instancer? Turned off, the object’s own UVs are used, turned on, each particle will reference the UV coordinate of its source point.


For whatever reason, all that does is just make the texture appear on each individual plane :/.

Well yes and no, even substance needs UV’s to paint textures.

The only thing that comes to my mind would be maybe instancing with geometry nodes.

Someone very clever (more than me) might be able to make a UV map for the instances that you could paint on in 3d texture paint mode but that might also imply realizing the instances and we get back to the same new problems that applying the particles would have.

Even then I do not think it would work, there are simple geometry node setups that flatten your geometry to the UV cords/map, from there I suppose you could instance the hair cards (flat) and use object cords to project the texture onto the fur.
The big problem would be you then have to “rebuild” the cat in 3d and the object mapping would no longer work once the fur is not flat (XY). You would still need to give the fur instances UV’s for it to keep working once you reconstruct the cat.

The other way (I know you do not want to hear this) would be to use hair curves not cards as they do inherit the body texture.

I did not answer earlier because I am really out of ideas but I like your moggy anyway :slightly_smiling_face: he looks great, I hope you find a way.

1 Like

That’s weird, that’s the result you’d expect if the setting wasn’t turned on: each image plane using its own UVs instead of sourcing them from the base mesh. Could it be, I don’t know, some sort of caching or graphics issue, with the updated setting not making its way into the render somehow? What happens if you turn it back off?

aaabsolutely nothing; there’s no visual change at all when I disable or re-enable it. I was actually wondering what that even did before I looked it up and was stumped when met with this same result


Ah, wait, here’s your answer—it only works in Cycles, so it won’t show up while you’re in Material Preview

1 Like

ahh, I was afraid of something like that. I’ve been trying to stick to EEVEE because it just generally performs better in my case and is a lot easier for the stylized looks I’m going for. I wonder if anyone’s made something similar (an addon or something) that doesn’t have to be done in Cycles…

Man, and I really liked how the fur cards looked and were coming along, especially since they’re very easy on my computer as opposed to most other methods.

I’ll experiment around some more to see if I can come up with anything. I’m thinking of maybe converting the cards to a mesh and manually selecting the ones I want colored a certain way and smooshing their UVs into the right area on the texture.

If that doesn’t work that’ll probably leave me with going the tedious route of manually making a different particle system for each color, swapping to cycles, or trying to wrangle hair curves to replicate the stylized effect. ORR attempting to wrangle some generated textures and masks to semi-procedurally make a fur pattern. Dunno if that one’s possible but I may give it a try.

I’ll post anything useful I find in this thread!

2 Likes

I had been switching all my stylized stuff over to EEVEE for some time, only to find this out haha.

It looks to me like the best way to go about hair curves with transferred UVs is to use this modifier setup in conjunction with a data transfer modifier:

This definitely isn’t as performant or “blender-like”, but I suppose one upside is it’s something could be exported to game engines fairly easily. I also find it easier to tune than strip-rendered curves.

I have figured it out at last, using some hair curves and geometry nodes
It looks something like this, feel free to copy from an attached blend file

There’s a few settings
Material is the material your fur will have
MainModel is the object you want the fur to be on
Instance is the model the fur will be rendered as

UseScaleTexture lets you use the [ScaleTexture] to adjust the scale of the fur
UseHairLength will snap the instance scale to the curve’s length
Only select one of the two

I do not remember what the scale slider does, feel free to figure it out
image

I would recommend using curves with only 2 points, as it will not account for any funky shapes the curve itself might have
It has worked pretty great for me


Aforementioned blend file
FurThingExample.blend (2.9 MB)

It works in both, eevee and cycles
And it can be baked to a texture as well

1 Like

Maybe, in hair material, try capturing attribute “surface_uv_coordinate” and plug its normal output to the texture’s normal input?