How do you fade foliage out when culling in the distance?

Use PerInstanceFadeAmount passes the current cull distance value, it seems to work well. I just tested it on a cube placed as foliage, using a masked material that’s just red base color and a linearGradient * PerInstanceFadeAmount plugged into opacitymask. It smoothly modifies the opacity mask gradient across all instances at the same rate nicely, no cluster popping.

I think your problem may be that your opacity map is just black and white with no gradient. Try blurring your opacity map texture. With opacity masking, Grays will dissolve faster, and white will be last to dissolve. After you’ve modified the opacity texture mask, your resulting foliage might look thinner or thicker alpha before the cull distances, you can use OpacityMaskClipValue in the material’s parameters to get the fully unculled alpha to be closer to where it was before the blurring. Once you get the hang of it, you can plan ahead and bake out pseudo-heightmaps or curvature maps or whatever needed to use for opacitymasks so you can better control the thinning of the dissolve look with masked materials.

Also with this technique you can mimic the vertex scaling trick you mentioned, by making a vertical gradient in your mask texture, with white at the bottom of the texture. That way it will appear to scale the foliage towards the base, without the geometry aligned to slopes issue.

I know the dissolve look on masked materials isn’t ideal as transparent fading. You might want to try a noise applied to your opacity mask, and try using DitherTemporalAA and see if that softens it up.