New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
banding and color differences in GPU path vs. CPU path #394
Comments
Have you tried reducing the stops allocated in the allocation vars? With respect, On Mon, Jun 8, 2015, 9:04 AM Mark Visser notifications@github.com wrote:
|
Hi, thanks for your reply. Yes, I've tried using a narrower allocation for the aces space. The banding is less, but the color difference is still there. Note that I'm using the aces_0.7.1 config for my example above, and it already has a tighter range ([-8.5, 5]) than the [-16, 6] discussed in the docs. I'm open to this being a configuration problem, but I've been unable to find a combination of allocation space and vars that fixes it. Our workaround is to bypass the GPU path in RV completely by dynamically baking LUTs for input space->display space instead. It works, but it's not ideal. :-/ cheers, |
Hi all, I want to add a +1 to this as it is a critical issue for us. The banding makes OCIO unusable for final review in any playback application that uses the GPU (for us this is RV, but I assume this affects other apps like Hiero). Honestly, I'm a bit surprised there is not more of a clamor about this as I assume it affects many studios. How are others dealing with this? @mjmvisser, any chance you could share some code from your solution? |
Hi Chad, Here's our modified RV ocio_source_setup package. Note that this hasn't been tested on RV 6 (we're still on RV 4). https://drive.google.com/file/d/0B880qC-5oTaTNGRMcDFFME5kZVE/view?usp=sharing edit: the version I originally uploaded had a cube size of 17. We bumped this to 65 today after noticing some color differences between Nuke (OCIO CPU path) and RV (OCIO baked LUTs). I updated the package. |
Hi folks, Whilst I don't have a solution for the problem just now, I am currently looking at improving the overall unit testing in OpenColorIO so we can catch these problems. I'll add some tests in to see if I can catch this issue and stamp it out for good. |
Great idea! I haven't had time to even look at this, but I was thinking that a test that compared CPU path to GPU path over a bunch of test cases would be very useful. |
whilst not necessarily the case in this example, I've run across a number of things that cause differences - so somethings to consider for the tests. power of two vs non-power of two 3D luts meaning apps re-sample to powers of two (quality LUTs use 2^n+1 node points, e.g. 17^3, 33^3, 65^3) Kevin |
Has there been any change with this ticket? I am experiencing problems here as well. We built a pipeline around using RV, Nuke, and oiiotool to either apply LUTs at display time or bake them in as needed. In testing everything seemed to match well enough, but now that we are hitting production we are finding images that contain a lot of skin tones look very different depending on if RV is used or Nuke/oiiotool which do match each other. I'm going to continue digging into the suggestions in this thread and try to make RV match our other tools. Unfortunately at our studio people preferred the look of the GPU applied LUT over the CPU applied one. Do you know which one is "correct"? Is there a fix in progress? Thank you! Kenny |
Unfortunately no. I "solved" the problem at my studio by rewriting the ocio_source_setup package to use dynamically baked and loaded .csp LUTs. So we're not even using OCIO directly in RV anymore -- at least not the GPU path. I asked about the stalled public development on the dev list back in Novembers and got this reply from Mark Boorer (who I assume works at spi):
I posted a follow-up asking if there was an update to the timeline, but no reply. :-/ edit: I think @Shootfast is Mark Boorer, hopefully he sees this and jumps in with an update. |
Thanks Mark! I saw your example and ended up doing roughly the same thing. Rather than baking the LUT dynamically in Python I just used the ociobakelut command and stored the resulting .csp file alongside our ocio config. Same thing in the end though, we are just working around it by not using OCIO inside of RV. |
Pinging this thread once again to see if there are any updates. |
Could someone check if this is just caused by tetrahedral interpolation not being implemented in the GPU code path? It sounds very much like it.. Simplest way to check would be to replace any |
I just tried this (had to dig out Nuke8.0v4 to test with the binaries I built). Changing the interpolation from tetrahedral to linear doesn't make a noticeable difference in either the GPU or CPU path. Same banding and difference between GPU and CPU. What I did:
(the ARRI IDTs are 1D luts, so they're already linear) edit: Just saw the thread on the mailing list, replying there. |
I don't object to OCIO providing a GPU implementation of the transforms but I question RV's decision to use opencolorio's GPU-, rather than the CPU-path. I believe RV's and Nuke's display color management has made use of OpenGL optimizations (pixel shaders, 3D textures etc.) since before their integration of OCIO. Shouldn't graphical clients of opencolorio (Nuke, RV, etc.) rely on opencolorio to provide the precise computation of the color transforms as defined in the config when generating their own internal 3D lookups. Should this step be a candidate for optimizations that are potentially lossy/imprecise? |
…uracies in OCIO's GPU Path OCIO's GPU render is not accurate enough. see AcademySoftwareFoundation/OpenColorIO#394 and AcademySoftwareFoundation/OpenColorIO#456
Addressed by #539 |
Hi, we have found in some cases a big difference between images viewed in RV and images viewed in Nuke (both using the respective apps' native OCIO support) as well as terrible banding. I was able to reproduce this issue in Nuke using @slooper's patch to OCIODisplay to include a GPU path (PR #328), so it is definitely a difference between the GPU and CPU paths in OCIO, and not an RV bug.
Here's a repro kit with compiled OCIO nodes (with @slooper's patch) for Nuke 8.0, 64-bit Linux: ocio-gpu-color.zip | uploaded via ZenHub
To see this problem in action:
1 = emulating what is happening in RV: input transform from logc to aces, then display transform from aces to rrt/srgb, both via the GPU path:
Note the banding.
2 = going directly from logc to rrt/srgb, also via GPU path:
3 = (control) logc to rrt/srgb via CPU path (using the OCIOColorSpace node, which does not have GPU path support)
The banding is most apparent when using an IDT and and ODT (as in the first example). However, even in the second example the color difference from the control is apparent.
To build @slooper's patch:
ADD_DEFINITIONS("OCIO_NUKE_GPU_ENABLE=1")
Building for Nuke 9:
m_textureName = uniqueGPUShaderId("$$lut");
tom_textureName = "$$lut";
I wasn't able to use the LD_PRELOAD trick to use these custom-built OCIO nodes in Nuke9 successfully.
The text was updated successfully, but these errors were encountered: