AcademySoftwareFoundation / AcademySoftwareFoundation/OpenColorIO
GPU 3D lut transform causes banding
- Lingua principale
- C++
- Stelle
- 2.1k
- Fork
- 503
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Descrizione
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:

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:

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?
Guida per i contributori
Apri la guida per i contributori
Direzione di ricerca
Inizia in src/OpenColorIO/ops/lut3d/Lut3DOpGPU.cpp alle righe 221-236 ed esamina il percorso esistente di sampleTex3D() e il relativo commento sulla precisione della GPU. Studia un approccio di interpolazione trilineare a piena precisione per le LUT 3D della GPU, quindi verifica che i risultati delle LUT a bassa risoluzione non mostrino più banding e concordino con il percorso CPU.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- cpp
- Ambito
- computer-graphics
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 45/100