Home › Forums › General Discussion › I made a tool for applying 3D LUTs to the Windows desktop
- This topic has 368 replies, 63 voices, and was last updated 1 month, 1 week ago by
Guillaume.
-
AuthorPosts
-
2026-04-23 at 17:20 #145756
It’s annoying. I managed to make a rough calibration matching. I disabled the main monitor LUT when I had to modify the TV CMS setting. And enable again when I had to check. It’s not perfect at all but it’s closer to it. I remember that Lauralex fork when I was on W10 was applying LUTs correctly in a multi monitor setup. I could try to check Lauralex code and compare it against ed1ii one. By the way the Discord server isn’t anymore reachable.
2026-04-23 at 17:29 #145757Yes I was on the Discord server for 2 days straight letting this person know what was going on, and on the third day the discord is gone and the github went to archive. Like I said he/she just quit after I told him/her that multimonitor isn’t working. Haven’t even given he/her on the other issues.
Looks like it’s a dead project now.
2026-04-23 at 17:34 #145758Before shutting down his Discord server, he left this message:
Following in the footsteps of Laurex and LeDoge—I’m officially dropping out of the project. Cube Community was a great learning experience, but the low-level dev work is just not where I want to spend my energy anymore. Thanks for being part of the project.2026-04-23 at 17:40 #145759Before shutting down his Discord server, he left this message:
Following in the footsteps of Laurex and LeDoge—I’m officially dropping out of the project. Cube Community was a great learning experience, but the low-level dev work is just not where I want to spend my energy anymore. Thanks for being part of the project.Yeah that’s what i figured…. he/she quit. Unfortunately I think most of us using calibrated workflow requires multimonitor (maybe except photoshop people) so dwmlut without proper multimonitor is really useless.
2026-04-23 at 19:28 #145760Grrrr…. I just read about low level programming and it sounds extremely tedious. And that explains why you have to modify the code at each OS iterations. It was the main reason why Ledoge and Lauralex stopped as you constantly have taylor the software.
Apart from that I was pretty excited about having a Discord server to make it a participative project. But now it’s another thing
I compared the ApplyLUT function on the dllmain.cpp from Ledoge/Lauralex and ed1ii and they are different. I’ll try to dig deeper but I don’t think it will be conclusive.
2026-04-23 at 20:59 #145761A question on the workflows requiring multi-monitor 3DLUTs:
- Are the displays so badly behaved that they need 3D LUTs and are not satisfied by a matrix for gamut mapping + 1D LUT? The latter is supported natively by Windows at least in HDR.
- Photo/video editing apps usually have complex color management and can use 3D LUTs. Don’t they solve the problem?
2026-04-23 at 21:15 #145762- Photo/video editing apps usually have complex color management and can use 3D LUTs. Don’t they solve the problem?
The point of using DWM LUT for Photoshop or similar software is not to rely on whatever LUT3D feature *in that specific software* but to linearize display globaly so:
-you can skip VCGT in GPU (banding in iGPUs and some nvidias, or all if Windows display power saving is called) -> MAIN REASON
-you can describe display by an idealized neutral grey (1TRC) single curve matrix display -> for display (or display presets) that need XYZLUT profiles.2026-04-23 at 21:45 #145763I’m asking in the context of finding the next best solution when a system wide, dithered, 3D LUT is unavailable.
Relying in a 3DLUT feature of a specific app shouldn’t be that much of a risk. It either supports it or it doesn’t. The hard part went into computing the LUT. After that not much one app can do differently than another. Different interpolation algorithm?
I’ve tested a Display profile with a 65x65x65 RGB LUT in Photoshop. Works as expected.
2026-04-23 at 21:54 #145764I use the BlackMagic Bidirectional Converters it can only house ONE 32³ 3D LUT. At least with the Bidirectional box you can loop HDMI and Loop SDI or HDMI <-> SDI.
If you find the BMD SDI->HDMI and a HDMI->SDI cheap, you can get those. Since I have 3 displays getting 6 of them isn’t exactly minimalistic. but it is still cheaper than getting a Lumagen Radience 4xxx series.
-
This reply was modified 1 month, 1 week ago by
mbze430.
2026-04-23 at 21:56 #145765And also more importantly, you can have the best possible calibration everywhere. You don’t need to use MacOS with its system wide CMS. And I did a MacOS VM and videos weren’t properly color managed so REC709 contents on my wide gamut monitor were oversaturated. Using the built-in software CMS “solves” a part of the problem but everywhere else it’s not solved. That’s why I did my MacOS VM but as I said it didn’t solved video colors. So having 3DLUTs at hand is extremely surgical. I was even able to upscale SDR to HDR with REC709 to native gamut remap (smart luminance inverse tone map then Chroma based remap using a mask in GIMP after ICM apply in Darktable). ICM profiles can’t do this. I should make a tutorial on it. ICMs/ICCs profiles are good but 3DLUTs is the step above.
2026-04-23 at 22:08 #145767ICMs/ICCs profiles are good but 3DLUTs is the step above.
ICCs can just embed a 3DLUT. Browsers might not support this, but photo editing apps like Photoshop do.
ICCs offer quite a lot of features, as per their documentation. See attached image.
Attachments:
You must be logged in to view attached files.2026-04-23 at 23:12 #145769And also more importantly, you can have the best possible calibration everywhere. You don’t need to use MacOS with its system wide CMS.
On macOS you’ll have the same problem as Windows regarding displays that are not properly described with a matrix profile, Apple CMS had its limitations.
macOS CMM do not have BPC, that’s the reason some apps rely on their own CMM. That why some calibration software warns you about storing actual display black level on display profile.You’ll have banding too on old systems (macintel epoch). Mx Sillicon seems to dither VCGT on GPU but I do not own one, let’s trust they do it properly.
macOS CMM is not “system wide” but rather requests to apps to set content colorspace, which do not happens on Windows since because legacy reasons most apps don’t. Windows just exposes its CMM (ICM) and the list ICC default profile for each device and expects apps to use MS CMM (or their own CMM). This is the reason sometimes previous versions of some apps like DOSBOX were non color managed on macOS. It is not exactly “system wide” because it needs to know content colorspace.
These and others are the reasons why Apple CMM is far from “the best calibration possible”. Adobe ACE exists for a reason.
Another different subject is that (current) Apple displays are very uniform, factory greyscale is neutral and overall they behave as a perfect additive RGB device, contrast is high > 1000:1 , so the “simple” profiles (single/equal TRC curves and a matrix + BPC = “fale infinite contrast”) works very well out of the box with the very simple CMM provided by macOS.
But this imposes a REQUIREMENT on display to be pluged to the computer (“well behaved display”, same behavior as Apple displays)So having 3DLUTs at hand is extremely surgical.
Usefulness of LUT3D on RGB dsplays is limited to very specific problems, like the two I mention above basically.
I was even able to upscale SDR to HDR with REC709 to native gamut remap (smart luminance inverse tone map then Chroma based remap using a mask in GIMP after ICM apply in Darktable). ICM profiles can’t do this. I should make a tutorial on it. ICMs/ICCs profiles are good but 3DLUTs is the step above.
There are several reason do not use LUT3D in SDR<->HDR as it has been extensively discussed on AVSForum.
It’s better to use a DisplayColorspace<->Rec2020 (or any other combination of “ideal SDR colorspaces” -matrix- you need, if you actually need a lut3d, instead of a simple matrix transformation based on ideal additive behavior) then running the SDR<->HDR (or any other specific mapping) in shaders.
LUT3D “density” is not that high to waste in HDR<->SDR conversions. Some “everyday use” regions of colorsace volume (SDR) will be interpolated from fewer points that way… so ***if you actually needed a LUT3D for that*** becasue you have bad behaved display, you loose correction capabilities.
Google madVR threads on AVSF because it was discussed extensively.2026-04-23 at 23:23 #145770ICC profiles are nice and I highly support them. But realistically OS implementations aren’t always great and the case of videos in MacOS made me realise that. It’s always better to do the CMS manually. Windows ACM is very bad and by using MHC2Gen it brings an avoidable step. I would love to use an OS with a perfect CMS.
@mbze430 : This solution is excellent for a 4K60 workflow but for refresh rates above it isn’t that great. I bookmark it though, so thank you for this input ! 🙂Edit : https://www.displaycalibrations.com/lut_boxes_comparisons.html
-
This reply was modified 1 month, 1 week ago by
Guillaume.
2026-04-23 at 23:25 #1457722026-04-23 at 23:26 #145773I’m asking in the context of finding the next best solution when a system wide, dithered, 3D LUT is unavailable.
Relying in a 3DLUT feature of a specific app shouldn’t be that much of a risk. It either supports it or it doesn’t. The hard part went into computing the LUT. After that not much one app can do differently than another. Different interpolation algorithm?
I’ve tested a Display profile with a 65x65x65 RGB LUT in Photoshop. Works as expected.
I meant the LUT3D “layer” on PS, and its very limited usefulness since content colospace for PS could be whatever you want, like TIFFs in any colospace like sRGB, AdobeRGB, Prophoto and its variants (melissa prostar…), DisplayP3, eciRGBv2…
So the wise solution is to expose a simple matrix profile with native gamut and linearize display to make it behave that way… *IF* like you said, we can have system wide LUT3D.Photoshop truncation on “content to display colorspace” is bad bahaved and lack of dithering, hence the “color” on black to white gardients. Using a 16bit file even if you cannot enable 10bit on PS is useful because truncation is not so dirty.
In my experience is best to let Photoshop belive that your display behaves ideally (excluding ACE’s black point compensation when you calibrate your display to 250:1). Otherwise you end suffering this kind of colorations ofr grayscale *** in bad behaved displays*** (with TRCs that are not “exactly equal”). This applies even if your GPU VCGT truncates to 8bit like Intel Iris laptops.
LR and CaptureOne seems to use some kind of dithering when color managing, even ACR module inside Photoshop (you can test it with 10bit grey image).
I’m asking in the context of finding the next best solution when a system wide, dithered, 3D LUT is unavailable.
IMHO & experience best approach is to let photoshop or any other editor believe that display is “ideal” = that can be described with single curve TRC matrix… and correct grey on VCGT the best you can (medium or slow speed on DisplayCAL)
-
AuthorPosts