How to fade out a opaque object
My goal is simple. I have a material with opaque surface, and I want to fade it away. It looks very simple at first glance, I can just change opaque to translucent and using opacity to do that. But I want to keep the opaque setting because the object is human and I am using subsurface profile shading model. So(from my guess) if I change to translucent the shading is no longer subsurface anymore(profile cannot be set and opacity no longer stand for the meaning in SS profile shading). I want the correct shading result of skin. So in my mind there are possible two ways to do that but after a long time searching online and doc, neither of them is easily doable.
1.Same material and using scene color and manipulate the final output of material. Two problems here: scene color(scene texture) cannot be used in opaque surface, and UE4 don't provide final fragment(pixel) shader output access(manipulate final color of pixel)
2.Multi-pass and I use output of previous pass as a input of second pass. So I render skin with opaque surface first and next pass use that and scene color in a translucent surface and blend in emissive color channel using unlit shading model. Two problems here: first similar to last solution which is not access to final pixel output, and second is UE4 don't support multi-pass.
There is other similar and "looks work" method online. One can be use post effect and mark human to write custom depth map. Then this can be regard as a solution for getting final pixel value. But in this case I don't know how to transfer the scene color before rendering human to this post effect shader to do the final blend.
Any thoughts is very helpful.
P.S. Other common ways are just not helpful at all such as layered material(material function) which don't support different shading model and is just a parameter blend. Otherwise it can be regarded as a multi-pass.
asked Apr 14 '16 at 06:44 PM in Rendering
This may not be exactly what you want, but I managed to create a fade effect using masked opacity. Here are three different material instances. I apologize for the poor gif quality.
I achieve this using Noise and Pixel Depth. Basically, each pixel is mapped to a noisy value X in [0,1]. Then I calculate the distance metric D = ( (PixelDepth - FadeStart) / FadeLength ) clamped to [0,1]. I set the opacity to 1 if X > D^FadePower and otherwise 0.
Here are imgur links showing the materials/functions used. First note the comments in this image of the Noise Settings. Performing a multiply on the position comes at a loss of resolution (bug!). To minimize such loss I use 4 separate noise nodes in the MF_Fade material function, which is a bit messy.
Using MF_Fade allows you to create material instances and tweak the noise scale on the fly (at a slight loss of resolution). Using MF_FadeSimple with a material instance would come at a higher loss of resolution. For lossless you can detach the position input in MF_FadeSimple and then tweak the noise settings on the node itself.
I am currently generating a bunch of tileable noise textures that I think will achieve better results. The resultant material will be simpler too. I'll provide an update when I'm done.
Follow this question
Once you sign in you will be able to subscribe for any updates here