AcademySoftwareFoundation / AcademySoftwareFoundation/OpenColorIO

GPU 3D lut transform causes banding

Offen
#1,763 10 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Needs Discussion
Vorherrschende Sprache
C++
Sterne
2.1k
Forks
503
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

I'm using 3d luts that span a large dynamic range and need trilinear interpolation for correct results (I'm happy to provide details of my use case if that's helpful).

Due to the nature of the luts, they should provide sufficiently accurate results even at relatively low lut resolutions. However, much to my surprise there is *significant* banding when applied by OCIO on GPU:

![gpu posterized](https://perm.cessen.com/2023/github/ocio_3d_lut_bug/gpu_posterized.jpg)

The only way to mitigate this is to crank the lut resolution extremely high, and even then especially dark colors exhibit some subtle banding. The results by CPU, on the other hand, are correct even with the low resolution lut:

![cpu correct](https://perm.cessen.com/2023/github/ocio_3d_lut_bug/cpu_correct.jpg)

Looking into OCIO's source, this seems to be the culprit:

https://github.com/AcademySoftwareFoundation/OpenColorIO/blob/b00877959f4497f9b8e5a08859d0ef8059fdd8e5/src/OpenColorIO/ops/lut3d/Lut3DOpGPU.cpp#L221-L236

It's even noted in the comment that this can be an issue on some GPUs. For the record, I'm using an nVidia RTX 3060. So not exactly niche.

I think it would make sense to replace the `sampleTex3D()` call with hand-written trilinear interpolation code, to ensure that it executes with full floating point precision and gives correct results on all platforms. It might be a small perf hit, but for something like OCIO I suspect correctness and consistency is more important here.

Would a PR along those lines be accepted?

Beitragsleitfaden

Beitragsleitfaden öffnen

Rechercherichtung

Beginnen Sie in src/OpenColorIO/ops/lut3d/Lut3DOpGPU.cpp bei den Zeilen 221-236 und überprüfen Sie den bestehenden sampleTex3D()-Pfad sowie seinen Kommentar zur GPU-Präzision. Untersuchen Sie einen Ansatz für trilineare Interpolation mit voller Präzision für GPU-3D-LUTs, und überprüfen Sie anschließend, dass Ergebnisse von LUTs mit niedriger Auflösung kein Banding mehr zeigen und mit dem CPU-Pfad übereinstimmen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
cpp
Bereich
computer-graphics
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
45/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.