As applicable to the blend, you don’t really need any vertex paint. Vertex distance to the height field will define your blend. Modulate it with a noise texture, and you are good to go. Keep in mind, that terrain heightfield needs to be sampled in vertex shader, not pixel shader, to avoid things being expensive. Worth mentioning that whole thing breaks on high slopes, and needs least distance to heightfield search instead of simply comparing Z position. Gets expensive at this point.
There is one huge downside of dithering mesh opacity, instead of using alpha blended terrain. It is huge amounts of parallax induced. Good for stills, but It is very noticeable in motion.
Think of it as being able to see through your rock indefinitely far, until something else blocks the sight. In most cases, it will be terrain itself, but not always.
Speaking about offsetting grass to fit terrain, it is a good method, but it is also situational. First of all, on high slopes it sill breaks, but it is not that significant. You ain’t using grass on such angles anyway.
Secondly, It depends on heightmap size. Large heightfields will cost more to sample.
Thirdly, without a system, that would bind a proper heightmap to a foliage instance, using world composition, the system is not maintainable for production.
But even then,I am not sure how to handle the case, where instance is located on the border of two landscapes.
But the biggest issue here is performance tradeoff. If you are using classical approach to grass rendering, you can allow yourself sampling terrain heightfield in vertex shader, it is fine.
If,however, you are running depth pre-pass in favor of zero overdraw(which seems to be becoming more of a standard nowdays), you would be doing that twice and I’d question feasibility of the method at all. Your vertex shader will be already loaded decently with stuff like wind and interaction. Adding one more fetch to it should be weighted carefully. You might end up trading off instance placement density to maintain the budget and ending up in a situation, where using smaller clusters will yield same performance as large clusters with offset.
One alternative method of getting terrain height would be using depth scene capture, but in a wicked way. Instead of covering whole area of interest with a capture, the capture should be done for a sector of the area. That way you can maintain a pretty large resolution heightmap, while capturing at sane resolution. It will need a composite shader pass, but seems doable. I’ve used this system for ocean/shore intersection detection in a large world and it was fine, but I am not a fan of introducing spikes by running captures on demand though. It is also sort of raindance, instead of a proper system.