POM is expensive - NOT! Here's an easy way to maximize POM quality in UE4 without much extra rendering cost: use Dither Temporal AA to increase the number of samples over time.
Benefits
- Smoother and fuller results, eliminate stair-stepping
- MUCH higher quality
- Ability to handle very low steps for major performance reduction
- Not much extra instructions necessary
Drawbacks
- Blurriness instead of stairstepping/pixel swimming artifacts
- Very low steps yields blurrier results (1-3 samples... actually surprised it can be pushed that far)
- 12 extra pixel shader instructions
- Requires TXAA
:| Don't let that stop you!
Future Improvements
- (POM improvement) - Support silhouettes
The Dither Temporal AA node works by adding screenspace noise to randomize samples and resolve over time. We can randomly sample the parts in-between steps and resolve to a final smooth blend using much fewer steps than what would be required without DTAA. Since the Temporal AA samples and convergence are already calculated and stored in the g-buffer, this material piggybacks off of existing systems.
TLDR: Instead of harsh cutoffs, DTAA POM resolves fully over time. The result is MUCH higher quality with minimal tradeoffs.
I have noticed discussion of this technique in forums, but it was always implemented improperly: Lerping Max Steps down to 0 with Dither Temporal AA in alpha. This will simply cut your average Steps in half and looks very rough. You can multiply this by 2 to bring your step average back to normal, but the result is still quite rough. The dither ranges 0:1 and resolves between double your step count and absolutely no steps at all!
Instead, I tried to find methods that limited the range to produce better results. We only need to resolve in-between steps, so randomizing (1/2x):(2x) gives the richest and cleanest result.
I attempted other methods, including those of forumgoers, but only the quality function is recommended.
Comparison shots below.
More steps are always going to be required to reduce blurriness. The dither is very powerful, so even extreme POM examples look fine at 8 or 10 max samples. You should place the same quality function for near samples as well.
Finally, here's a nice wow shot: the sand in my test project, Jake, used to use tessellation, but that proved to be too expensive. No amount of optimizing made it sane, not even for extremely high resolutions. I replaced it all with POM, and the results were still very iffy with the steps ranging 4-16. Now, it looks beautiful even with a range of 1-12. In this image, the height of the parallax was doubled, and the samples reduced to 3-10 (in practice averaged 3.75-12.5).
Flat Lighting |
DTAA POM - 3 Min Steps, 10 Max Steps - Quality Function |
This only looks slightly blurry with 1-4 steps.
No comments:
Post a Comment