Wire+Resolume: My recipe and workflow for getting best gradients

Just let it all out, buddy. You're among friends here.
Post Reply
User avatar
webel
Posts: 80
Joined: Tue Feb 08, 2022 03:49
Location: Sydney, Australia

Wire+Resolume: My recipe and workflow for getting best gradients

Post by webel »

Please note I'm not a VJ; I'm using Wire (sometimes together with Resolume Avenue) to create high quality video content - usually from high resolution macro photography or 4K video - which I then collate and edit on a Mac in ScreenFlow or Final Cut Pro. So my requirements may be different from some of you (and not always as the Resolume tools are designed to handle).

Over the last week I've been working intensely with patches that use Wire's Gradient, and here is a summary of my conclusions and workflows. Some of the following involves technologies outside the Resolume world. I omit screenshots here because I'm viewing on a 5K iMac with 10-bit display and my conclusions are based on that, not on what you might see on this forum posting via a web browser.

- There is no way of using Gradient with the patch set to only 8bpc that does not end up with banding that is too prominent and distracting for my purposes (not VJing). [EDIT: Using the (by default "hidden") dither inlet/variable on Wire's Gradient helps, see links to side-by-side tests below]

- Use Gradient at 16bpc int, either through the per-patch setting, or the per-node specific setting.

- Using 16bpc float or higher bpc in Gradient did not seem to help (in fact in some patches, using 16bpc float in the patch seemed to cause some strange side-effects in Video Mixers).

- Use 16bpc int across a patch is a massive CPU/GPU hit. So I prepare Wire patches using lower bpc, and then when I'm ready, I switch to 16bpc int, start Export, then do something else for a while.

- Exporting using Motion JPEG gives significantly more banding than DXV3 or ProRes422. (I was using Motion JPEG for various reasons, such as can be directly viewed in QuickTime, but you can always load DXV in Alley to just view it.) I now completely avoid Motion JPEG.

- Exporting at DXV3 Normal (8 bpc) gives slightly more banding than ProRes422 (10 bpc).

- Exporting at DXV3 High gives less banding than DXV3 Normal but just slightly more than than ProRes422.

So ProRes422 is my current "goto" for exports of content with gradients, except where I am further processing the Wire export in Resolume (Avenue), where I can sometimes get away with feeding DXV3 High into Resolume, and then clip-exporting from Resolume at ProRes422. But even then, where Resolume can handle the ProRes422 (note I'm not VJing live), it's best to feed it ProRes422 with minimal banding.

Did you know? You can upload DXV directly to Vimeo! :D

Some remarks on downstream processing (involves other technologies):

I use Handbrake with software x265 or VideoToolBox hardware H265 (massively faster but slightly lower quality) for MP4 creation. No matter what settings, no matter what bit rate or quality factor, I got significant, distracting gradient banding, even with sources that had barely any. This is with 8 bpc, I could not see how to change that in Handbrake, even if H265 supports 10 bpc.

Why would I want H265 MP4s of my of my shiny Resolume/Wire work? Because, although it's not a good intermediate CODEC, the otherwise wonderful ScreenFlow video editing software handles MP4 input a bit better than it handles ProRes422 (it can read it, but it's sometimes slow moving from frame to frame and on replaying). It also seems to display the ProRes422 at lower bpc, so you can "see" gradient banding again. [EDIT: Tested a Wire 16bpc moving gradient exported as ProRes422 direct into ScreenFlow then exported out from ScreenFlow at "lossless" ProRes422, I could definitely see prominent banding, it is introducing it somewhere.]

Final Cut Pro does not seem to read DXV, but does read ProRes422, and (even though most editing in ScreenFlow is in fact massively easier than Final Cut Pro) it displays nicely on my 5K iMac with 10-bit display, showing no obvious additional banding. So those nice Wire Gradient gradients that started at 16bpc and were well preserved by ProRes422 are done justice.

Who'd have thought? The dedicated intermediate codec with the bigger filesize gives the best results for high quality generated content (noting again I'm not VJing). And yes, I did have to spend last night clearing out some space on my external SSD 2TB media drive.

Also, by staying in the ProRes422 world, I avoid the need for performing any interim conversions, which saves a lot of time. And although ProRes422 takes a lot of disk space, I save a little bit of disk space by not having additional conversions to MP4 or other.

---
Update: Side-by-side driven gradient dithering tests

Links to some tests of the 'dither' parameter on Wire's gradient, with two colour gradients driven by smoothed randoms. Links are to 30s video on Vimeo. All were exported from Wire as ProRes422. Each video shows the un-dithered on the left, and dithered on the right, and indicates the dithering value and the patch bpc. At 4K and 8bpc patch colour depth I found a dithering value of about 16 is a good compromise between banding and noise/grain. At 4K and 16bpc the banding is less noticeable, but the dithering is still worthwhile. The banding is far more noticeable (as perceived) in all cases when the gradient is changing/driven.

4K 8bpc (int) dithering 32: https://vimeo.com/674821378/0dffd70c5a

4K 8bpc (int) dithering 16: https://vimeo.com/674828726/1f48bca5ca

4K 16bpc (int) dithering 32: https://vimeo.com/674834733/fbb1d39b9c

4K 16bpc (int) dithering 16: https://vimeo.com/674834471/50b75f4c28

The dither is not a cure-all; you can get some strange artefacts if, for example, you use high dither in Gradient with Type 'angular' into Bendoscope, as shown here: https://vimeo.com/675254871/0d5b49a1da
Last edited by webel on Wed Feb 09, 2022 03:11, edited 6 times in total.

edwin
Team Resolume
Posts: 1207
Joined: Thu Oct 07, 2004 10:40

Re: Wire+Resolume: My recipe and workflow for getting best gradients

Post by edwin »

Gradients are hard to get right. Especially if you need to compress the end result to a video file. And even if your compression is lossless there are various reasons why the the Gradient won't show without banding on screen.

The best results i found so far is to add 'dither' to the gradient. It wil make a world of difference, the banding will still be present (because there are just so many steps, 256 for 8bpc) but much less noticeable.

Also its next to impossible to get rid of banding in post-processing, so it should be fixed when actually creating the Gradient.

edwin
Team Resolume
Posts: 1207
Joined: Thu Oct 07, 2004 10:40

Re: Wire+Resolume: My recipe and workflow for getting best gradients

Post by edwin »

I made a shader in ShaderToy that demonstrates the use of Dither in Gradients.
Top part is with Dither and bottom without, best to use the '[ ]' button to watch it fullscreen. You should be able to see the difference quite clearly.

There is variable at the top which controls the amount of Dither btw.

Code: Select all

float Dither = 4.0;
https://www.shadertoy.com/view/sdSyDt

User avatar
webel
Posts: 80
Joined: Tue Feb 08, 2022 03:49
Location: Sydney, Australia

Re: Wire+Resolume: My recipe and workflow for getting best gradients

Post by webel »

According to someone at http://resolume.com/forum/viewtopic.php?t=15000, DXV3 High Quality is 16 bpc. Can anyone at Resolume confirm this?

I wrote (claimed):
Exporting at DXV3 High gives ... just slightly more [banding] than than ProRes422.
This is of course hard to judge. I can't see how to compare them side-by-side in Alley, so I just watch one and then the other and try to compare.
Darren Kelly (PLAYlogo), Webel IT Australia

User avatar
webel
Posts: 80
Joined: Tue Feb 08, 2022 03:49
Location: Sydney, Australia

Re: Wire+Resolume: My recipe and workflow for getting best gradients

Post by webel »

edwin wrote: Tue Feb 08, 2022 10:22 I made a shader in ShaderToy that demonstrates the use of Dither in Gradients.
Top part is with Dither and bottom without, best to use the '[ ]' button to watch it fullscreen. You should be able to see the difference quite clearly.

There is variable at the top which controls the amount of Dither btw.

Code: Select all

float Dither = 4.0;
https://www.shadertoy.com/view/sdSyDt
Wow, compelling, thx. And yes, needed watch in fullscreen on iMac 5K to see difference clearly.
Darren Kelly (PLAYlogo), Webel IT Australia

User avatar
webel
Posts: 80
Joined: Tue Feb 08, 2022 03:49
Location: Sydney, Australia

Re: Wire+Resolume: My recipe and workflow for getting best gradients

Post by webel »

Updated initial post with Vimeo links to some comparative tests of the 'dither' parameter on Wire's gradient, with two colour gradients driven by smoothed randoms, with different dither levels, and 8bpc vs 16bpc, at 4K.
Darren Kelly (PLAYlogo), Webel IT Australia

User avatar
webel
Posts: 80
Joined: Tue Feb 08, 2022 03:49
Location: Sydney, Australia

Re: Wire+Resolume: My recipe and workflow for getting best gradients

Post by webel »

And just to show that Dither in Gradient is not a silver bullet, here's an image from this side-by-side video (https://vimeo.com/675254871/0d5b49a1da) showing dither=32 on angular Gradient into Bendoscope in a 16 bpc patch exported as ProRes422. Note the artefact on the right in the centre:
2022-02-09-Wire-dither32-vs-Gradient-angular-Bendoscope.jpg
Darren Kelly (PLAYlogo), Webel IT Australia

Post Reply