Ever since “Photorealistic Character” sample came out, I wanted to apply the technique to char with significantly lower poly count. Don’t use hundreds hair planes or splines, keep textures at 1K and see how close I can put the camera without cringing. I must say that results that I got exceeded my highest expectations.
Epic, your skin, eye and hair shader models are awesome! Bravo!
Update: the normal map in below shots is wrong (R/G channels swapped). See new screens further down in the thread with corrected map.
Awesome Work @loomman. I’m discussing this very thing over here. I want to apply the Real Skin to an Anime Character. I’m no material wiz, but I will give it a go, if the modifications are minimum. Are you using the Photorealistic Character Shader with few modifications?
Thanks! This is the first time I ever pulled a character into UE4. I wanted to study a pipeline a bit and mainly test new shader models. I also put a bunch of artificial constraints like keeping the poly cont low and use as minimal texture budget as possible. So everything is pretty amateurish. However, I will put up a little write-up with tips and tricks that might help other hobbyists like me to unlock full potential of these shaders.
1. Once you import your model in.
Select a suitable yet simple lighting setup. Simple_Bust map is perfect. Don’t use outdoor map since it has a truckload of PP, tone-mapping and whatnot.
I added skybox with HDR cubemap that added subtle lighting - black backdrop makes authoring hair a bit harder.
Here I made my first mistake - don’t keep your mesh static and don’t bake lighting. Your character will be skeletal mesh in the end and will use dynamic lighting. So just set it to Movable right away if you are working on static mesh.
I spent several hours in amusement perfecting the skin and started on hair when I had that “Oh wait…” moment. Hair shader behaves pretty funky by the way when lighting is baked.
Setup a PP volume or pilot CineCamera with Auto Exposure min and max brightness set to 1.
2. Skin shader
Pure awesome sauce! Very straightforward, easy to setup, all parameters are clear and affect result in predictable manner. The trick here is to use all 5 proper texture maps - BaseColor, Normals, Roughness, Specular and Scatter.
Ideally you would want to have high poly model created in Zbrush with all wrinkles and pores from which you could bake your Normals and Specular maps. I didn’t have that luxury and I can’t sculpt so I used Digital Emily project to add detail to my existing textures. I used specular_unlit_raw data, added it to Specular texture and also used nVidia plugins to add the same into Normals texture. To sum up, add pigmentation and other color imperfections to BaseColor, add pores and wrinkles to Specular and Normals. Hand paint Roughness and Scatter using Photorealistic Character textures as an example. Consider Roughness texture as the way to globally control specular highlight.
When you add BaseColor and Normals textures - result will be already way better than default opaque shader, but still a bit plastic looking.
When you add hand painted Roughness texture - plastic feeling will be almost gone but still not quite right.
When you add proper Specular texture - Wow factor. You spend half an hour admiring the view.
Lastly, when you add Scatter texture - icing on the cake, adds that bit of warmth - I used close-up on nostrils to fine tune the effect but basically left it the same way Epic set it up. I didn’t change SSP at all.
Last note here, not really related to skin shader itself - if your model is very low poly like I used, you might see shadow banding and artifacts. This is due to self-shadowing and is easily fixed by adjusting Shadow Bias parameter on the spotlights. Gradually increase the bias until banding is gone. You can also use Shadow Filter Sharpen if change in bias is too big to your liking.
3. Eye shader + occlusion plane + eyelashes
The simplest one to setup of the 3 shaders. Not much to cover here. I borrowed Mr. Photorealistic Character eyes since I had no interest to try and adapt shader to lower poly eyeballs without “bulge”. Just changed iris texture. All parameters are straightforward.
Occlusion plane is a must here though. Make sure it covers the eye opening. Material instance for it has a lot of parameters and overwhelms at the beginning but eventually is easy to tune properly. I first blurred the whole effect and set corner/top/bottom vertex offsets and depth offset properly, then tuned blur/shadowing.
Eyelashes: Photorealistic Character setup for eyelashes is imho overkill geometry-wise and a bit weird in texture department. I removed all the single strands, and simplified all the planes. Then just added density of the lashes on the textures and tweaked material instance parameters a bit to my liking.
4. Hair shader
This one is by far the hardest to get right. In my case I did not want to use hundreds+ of planes and had only single geometry shape for hair to work with. Before I realized my mistake with baked lighting my initial attempt looked horrible. After I switched to dynamic lighting I managed to get better result but it was still crappy. Be advised - even though you can get nice result with baked lights, the behavior of hair shader is drastically different between static and dynamic lighting.
In the end, here is the summary how I achieved the result seen on the screenshots:
Since I am using single geometry for hair, Root map is useless.
Alpha, Depth and Unique_Hair_Value are mandatory. You can’t just paint all 3 of them by randomly placing strands. If you do that, hair will feel flat and not realistic at all. Each strand must be present in all of them with appropriate color information. Best approach here, again, is to bake from high poly. In my case, I borrowed one clump from Mr. Photorealistic Guy hair textures, re-scaled it into strand, then warped many of them to form my textures.
I used Unique_Hair_Value as a mask to make Diffuse texture
Strands must have enough fidelity in the textures - I had to use 2K, 1K was too low.
For material instance parameters see the attached image below. All scalars you just tweak back and fourth million times until you get that look you need. This makes hair shader more tricky to get right than skin shader. EdgeMaskMin helps to soften hard edge caused by geometry. PixelDepthOffset actually adds the strand-effect based on the Depth mask. In vector parameters Tangents are very important for this setup - they help to get nice anisotropic highlights. If you don’t properly set those, hair does not look realistic.
Pigtails are shaded with cloth shader. Tips are just several intersected planes with hair clump textures (hair shader).
Well, this write-up ended up being not so small. I hope it will help beginners in character texturing/shading.
Well, actually normal map in the above screens is wrong! Apparently, I accidentally swapped red and green channels when I was playing with its intensity. And I had a thought that shadows are somewhat wrong… but was blinded by skin shader awesomeness. Rookie mistake. :o
I also fixed pigtail tips - while observing my daughter’s hair I realized that I did them wrong.
Finally, some thoughts about texturing this char body. Result is ‘meh’, on closeups it is anything but photorealistic. I had to up textures to 2K and this is still not enough. I guess much more geometry is needed and 4K texture budged. Another note is that I got to understand why Epic promotes the flow they used in Infiltrator demo and Paragon - blended materials are so much easier to work with for artists. Here I had to author diffuse and roughness textures for ridiculously long time. It would have been much easier with blended mat setup. Of course blended material is kind of expensive and compromise must be made if you, say, doing MMO for example. But there still should be an easy way for artists to author metals/leather/cloth globally throughout the project.
Anyway, new screens below.
For real applications I would definitely create custom shader for saber blade glow to better control core, secondary color and overall bloom. Similar to how I did fake Rayleigh scattering effect and eclipse in my planet shader. For this small toy project though I kept it simple. Bloom here is not really good at far distances and on closeups jagged edge is apparent.
Played around with Sequencer for this test of the saber blueprint. Lots of fun. However, no matter what I tried I couldn’t make Sequencer render proper quality frames. For some reason half of my cine camera settings were not applied. Exporting avi was equally as bad. Moreover, sound tracks are not included. Bummer. So recorded with 3rd party software.
Don’t get me wrong, there are some computer graphics out there, that look like a photo, so you could call em photorealistic. This example is obviously not as you can see from the first glimpse that it’s computer generated. She looks nice and all is fine technically, but it has nothing to do with a photo or even photorealistic. Also I would not call it low-poly.
So why do you use those terms here, when they are obviously not fitting?
This is no ciritique of the art, just about the wording.
Well, if you put it this way, title is indeed misleading. Originally I wanted to apply skin/eye/hair shader to a low(er) poly char, simple hair geometry, keep textures at 1K and see how close to “photorealistic” I can get. Like, try real world scenario where you can’t go overboard with 100K geometry and 4K textures. The simplicity of skin shader setup and results an amateur can quickly get with it amazed me so much, so “photorealistic” stuck in the title.
Later project moved on (I still need my Star Wars fix), so I completed texturing the whole body. As I mentioned, on closeups there’s nothing photorealistic in it…
I will put two screenes below, which of course will prove your point that wording is bad. However they will also show how close you can get. Full model is low poly - 22.3K tris (from which 4.8K tris are eyes/lashes/eyeAO I borrowed from Photorealistic Character bust).