Closeup of Groom POM |
Various Foxes Rendered in UE4 |
I think it's no surprise why so few games take a legitimate stab at trying to replicate real fur on characters. Rendering millions of individual fur strands are impractical, and keeping things basic tends to yield the most appealing results. The Billie Bust Up example has the most appeal, but makes no attempt to capture texture. Similar for the Poly Art example. Epic's own Fennix from Fortnite balances appeal and resolve, but mostly uses medium-sized polygons to capture tufts of fur rather than worrying about texture. FostAPK tried a more realistic texture on a flat model, but it becomes quite obvious the fur is fake and the appeal goes down. The most realistic approaches use shells to make an attempt at generating the appearance of strands of fur leaving the model, but the results are often poor quality and unappealing.
Murnatan Aliens - AAAGames Designed by Tomáš Drahoňovský Using Neoglyphic's Neofur plugin Developed by Carlos Montero et.al. |
Groom POM 171 total pixel shader instructions 2-16 steps DTAA, 2.5-20 step average |
- Beautiful furry and fuzzy look with clear layering
- Easy drag-and-drop results
- Note - Direction relies on texture coordinate and UVs, which require careful consideration, but it can be dropped on any mesh for instant results without plugins.
- Direction and length can be easily controlled by the artist
- Can also be easily expanded with constants and custom flowmap/groom textures, even panning textures to simulate wind
- Optimization is superb
- Steps are reduced evenly across the surface with minimal distortion
- DTAA gives impressive results with blurring/fuzziness as an appealing artifact for lower samples
- Very low min steps (2-3) looks very good
- 16 max steps looks satisfying. Diminishing returns with higher samples.
- Not much more expensive than other, less interesting surfaces
- Flow direction can be used for calculating tangents for anisotropy in shader (will experiment with this later)
- No exposed fur on silhouettes
- Experiments show silhouettes are possible, but tend to leave gaping holes in the mesh when using Fresnel. It's possible to use 2 copies of the mesh, one solid with inward vertex displacement, another with masked translucency to provide silhouettes without disappearing completely. This would be more complicated to rig and animate properly. It would be easier to analytically calculate a proper solid zone in shader. Maybe with sobel edge detection? Custom depth? This needs more experimentation.
- Distortion around the surface
- Persistent issue with POM
- Sharp hairline details do not look as good as softer fur - I.E. shiny wet black dog
- Such examples should be textured flat on the model with anisotropy anyways.
Flow Map is actually a 3-Vector input. XY/RG controls the direction (in texture space), while Z/B controls the length. |
Steps Optimizer - 9 extra instructions vs. unoptimized |
This optimizer converts the flow map into normals and compares to the camera angle. Short fibers, and fibers facing toward the camera receive less samples than long fibers facing perpendicular. The lack of a clamp after the dot term makes it possible for the samples to be increased beyond max if the direction is elongated (XY flow map determines direction across the surface, Z determines length). The added benefit of using the optimizer is a more consistent look across the surface - samples don't just build up in one part of the mesh more than the other.
Final look - Shadow, AO, and Fresnel in Cloth Shader |
This is what completes the final look. The heightmap is used to generate a "shadow" from the base of the hairs pointing outward, making individual strands stand out. AO emphasizes this shading in the shadows. Higher roughness and the Fresnel term gives the fur a brighter sheen at grazing angles according to the light source, where light would be picked up by the fur.
Happy Fox by Ma-zach This is not UE4. But it could be UE5... |
This looks great, been trying to updated to to UE5 but some of the nodes don't want to import. I'll let you know if I manage to get it working.
ReplyDelete