Ver Feed RSS

ColorConsultant

FAQ VIII - Calibración LUT3D en Windows con cualquier monitor y GPU

Valorar Entrada
Hace unas semanas apareció un software llamado "DWM LUT" para Windows 10 (20H2 o posterior) que permite ejecutar de forma global en el escritorio una LUT3D. La LUT3D funciona con precisión de bits alta y con dither, todo ello ejecutado en los shaders de cualquier GPU moderna. NO requiere del uso de la calibración de gris con LUT 1D presente en cualquier gráfica y que salvo en AMD acababa causando banding por truncado de salida o falta de dithering.
En la práctica esto significa que se podría dotar de algo equivalente a calibración hardware y sin banding a CUALQUIER PANTALLA (tenga o no calibración hardware) en CUALQUIER GPU (incluidas integradas intel) y bajo CUALQUIER CONEXION (incluido DVI a 8bit).

El formato de LUT3D es el IRIDAS .cube de 65 nodos por lado usado en Resolve y otro software y puede generarse con DisplayCAL.

La aplicación consiste de una DLL que es quien usa el DWM (Desktop Window manager) de Windows 10 y engancha a él la LUT3D de forma global en el escritorio, tanto en pantalla completa como escritorio habitual.
Se acompaña de una aplicación que hace de interfaz grafica de usuario para cargar y descargar LUT.


¿Que es una LUT3D?

Un dispositivo como puede ser un monitor con cierta configuración, o una impresora con ciertas tintas y cierto papel tiene un comportamiento que define el espacio de color que puede mostrar.
Cuando se crea un perfil ICC lo que se esta haciendo es capturar en un fichero este comportamiento. Tal y como está explicado en la FAQ I, se puede guardar esta información de una forma idealizada o mas detallada en un perfil ICC.

Una LUT3D no es mas que una transformación de un espacio de color (definido por un perfil ICC) a otro (definido por otro perfil ICC).

En el caso que nos ocupa se trata de hacer que una pantalla se comporte como si fuera igual a un espacio de color determinado, "calibrarla" para que se comporte de cierta forma. De cara a los programas la pantalla sería idéntica a ese espacio de color que queremos simular.
Por tanto la ENTRADA a la LUT3D es el espacio de color ideal que queremos simular, sus números RGB como por ejemplo (255,0,0 sRGB) y la SALIDA de la LUT3D es el espacio de color que describe a la pantalla en su estado actual, sin LUT3D, es decir los números RGB (DISTINTOS a la entrada) que en el espacio de color de la pantalla tendrían las mismas coordenadas de color.
Las LUT3D pueden generarse con el LUT3D creator de DisplayCAL en base a perfiles ICC: DisplayCAL-3DLUT-maker.exe
En general es mas fácil trabajar como si las pantallas tuvieran contraste infinito, equivalente a la compensación de punto negro, que en el DisplayCAL-3DLUT-maker equvaldria a usar el perfil origen "black output offset" al 100% y en perfil destino perfiles creados con compensación de punto negro. Puede usarse otra configuración, esta es sólo una recomendación simplificada para pantallas tipo IPS con contrastes típicos de 700:1 o mas.
Al transformar de un espacio de color a otro se puede cambiar también el punto blanco si se indica (por defecto) que se realize con un rendering intent "absoluto colorimetrico". Si no se desea cambiar el punto blanco, por ejemplo porque se haya obtenido mediante un match visual de papel y pantallam, debe usarse rendering intents relativos al punto blanco como por ejemplo "relativo colorimetrico".

Ejemplo:
Tenemos una pantalla multimedia 95% P3 que no tienen modo sRGB o es muy malo o que si activas el modo sRGB bloquea el brillo.
Obtenemos un perfil ICC (con o sin calibración del gris) que describa esa pantalla.
Podríamos generar una LUT3D que haga que la pantalla se comporte globalmente como si fuera una pantalla sRGB. La entrada a la LUT3D sería sRGB (lo que se quiere simular), la salida el perfil ICC que se ha creado para la pantalla (como se comporta realmente la pantalla).


Limitaciones

Una transformación ultradetallada de un espacio de color de 24bit a otro de 24bit requeriría un cubo de 256 nodos de lado, es decir un total de 16millones de nodos en el cubo. En 30bit un cubo de 1024 nodos de lado, y mas de mil millones de nodos.
El formato IRIDAS .cube de tamaño 65x65x65 (65<256, 65<1024) interpolará los huecos que quedan al tomar sólo 65 muestras de 256. En casos muy extremos (monitores con un comportamiento muy malo) podría ser insuficiente, pero cualquier monitor que pueda ser descrito con un perfil ICC de tipo matriz de forma mas o menos precisa no tendría ningún problema. Esto incluye la mayoría de pantallas IPS tanto sencillas como mas avanzadas.


Aplicación

La aplicación se distribuye como código fuente, sin binarios, desarrollada por un tal LeDoge que sólo or el avatar y nombre merece mi simpatía (es un meme de un perro shiba inu popular en internet).
https://github.com/ledoge/dwm_lut
La DLL requiere para compilarse MSYS2 y el programa con la interfaz gráfica requiere Visual Studio 2017 o superior y con .NET 4.8.
Como muchas personas no disponen de estas herramientas, pedí un binario y lo dejo aquí:
https://1fichier.com/?1hfyid0ij4g2ovke9f0j
El ejecutable requiere permisos de administrador y no está firmado, por lo que aparecerá como origen desconocido y alerta de seguridad.


Casos de Uso

Gamers
Una persona se compra una pantalla widegamut P3 de juegos. Dicha pantalla no tiene modo sRGB o Rec709 o similar. Los juegos y otro software lúdico no llevan gestión de color. Se vería todo sobresaturado si ese contenido estaba pensado para sRGB. Pueden darse dos situaciones:

-No tiene colorímetro (la habitual)
Perfil origen: sRGB
Perfil destino: el perfil ICC que viene con el driver del fabricante o un perfil generado desde los datos del EDID con DisplayCAL
No hay calibración VCGT con lo que no es necesario aplicarla.
En el SO, en la configuración de gestión de color se escoge como perfil de pantalla sRGB. Para todas las aplicaciones, incluidas las que tienen gestión de color será sRGB.
Esa calibración simulando sRGB será mas o menos precisa dependiendo de si el perfil del fabricante o generado con datos EDID representa fielmente o no a esa pantalla.

-Dispone de colorímetro u otro aparato de medida

Primero se calibra (gris y blanco) como una pantalla normal. Se usa el preset OSD que deje tocar mas parámetros. Con ese perfil se generará la LUT3D.
Perfil origen: sRGB
Perfil destino: el ICC creado, aplicar VCGT en la LUT3D.
En el SO, en la configuración de gestión de color se escoge como perfil de pantalla sRGB.

Arrancar DWM LUT GUI y cargar la LUT3D. En ambos casos si se quiere usar el monitor con su espacio de color original, se deshabilita la LUT3D y se pone en el SO en el apartado de gestión de color que el perfil ICC de la pantalla es el del fabricante o bien el perfil ICC hecho a medida.

Fotógrafos y diseñadores
La calibración de gris por GPU, usando las LUT1D dedicadas de la tarjeta gráfica, causa bading con muchos fabricantes de tarjetas gráficas. Es el primer problema a evitar.
También ocurre que muchos programas, incluido Photoshop, Illustrator, Indesign..., no aplican dithering al presentar en pantalla (Lightoom y CaptureOne si lo hacen y no tienen este problema) por lo que en muchas configuraciones como por ejemplo perfiles de pantalla con TRC que no son idénticos causan molestos errores de redondeo.
En este caso además no se quere limitar el espacio de color a sRGB sino usar el mas amplio posible que permita el monitor porque esa persona querrá ver y editar imágenes sRGB, AdobeRGB, ProPhotoRGB, eciRGBv2...
El objetivo aqui es hacer que la pantalla se comporte de cara a todos estos programas como una pantalla "ideal" que pueda ser descrita por un perfil idealizado (matriz) que además indique un gris perfecto (3 curvas TRC del perfil ICC iguales). De esta forma la gestión de color por parte de programas como Photoshop será menos intrusiva y con menos errores de redondeo. Adicionalmente a esto eliminar el banding que sufren muchas marcas de GPU al cargar calibración del gri.
Esa pantalla "ideal" quedará descrita por un perfil ICC. La forma mas sencilla de generarlo es hacer un perfil sintético. DisplayCAL tienen una aplicación para crearlos: DisplayCAL-synthprofile.exe
Partimos como base de un perfil ICC hecho a medida por el usuario, que es con el que se ha estado trabajando en esa pantalla hasta ahora. Ver FAQ VI si no se dispone de uno.
Dicho perfil sintético:
-tendrá como primarios R, G y B las coodenadas de color de la descripción matriz del perfil a medida
-tendrá como punto blanco el blanco de ese perfil a medida... o bien otro punto blanco alternativo (reducirá el contraste final).
-tendrá como gamma/TRC el valor medio o nominal de ese perfil ICC a medida, o bien el valor que se desearía tener (2.2, 2.4, L*)
-tendrá, como simplificación, contraste infinito (equivalente a perfil ICC con compensación de punto negro)
Una vez creado el perfil, en el LUT3D creator de DisplayCAL:
Perfil origen: el perfil sintético. Este perfil se asociará en el SO, en el apartado de gestión de color, como perfil por defecto de la pantalla.
Perfil destino: el perfil ICC hecho a medida para la pantalla.
Aplicar calibración VCGT en la LUT3D, para no tener que sufrir banding en GPUs no AMD.
Una vez creada la LUT3D. Se abre DWM LUT GUI y se carga la LUT3D.
Se verifica con DisplayCAL, en "Measurement report" con todo puesto a valores por defecto, sin perfil de simulación, que con la LUT3D cargada el monitor se comporta tal y como dice el perfil ICC sintético "ideal" configurado en el SO como perfil de pantalla.

Videografos
-Resolve:
No os hace falta todo esto, Resolve tiene una LUT3D por software.
-Editores de video sin gestión de color
Ver apartado gamer, usuarios con colorímetro. El origen en vez de sRGB podría ser Rec709 con gamma 2.4 o alternativos.
-Premiere
Ver apartado fotógrafos


Cosas pendientes

En su estado actual la aplicación no carga esa LUT3D al iniciar la sesión de Windows, deberá hacerse de forma manual. Se podría sugerir al desarrollador una aplicación que se pueda cargar al inicio similar a la de DisplayCAL. Al cargar la LUT3D tarda un poco en actualizarse la pantalla. Si se cambia de una ventana a otra se fuerza esa primera actualización.

Esta LUT3D no corrige los problemas de uniformidad que plagan todos los modelos widegamut baratos. Podría modificarse para incluirla mediente un mapa de uniformidad similar al que se obtiene con DisplayCAL, pero si el monitor es malo corregir estos problemas de uniformidad destruirá el contraste y cuanto mas malo sea (Delles, Benqs, Asus) mas contraste se perderá. De igual forma no puede solucionar los problemas de mal contraste (por mal panel, de mala uniformidad corregida en fábrica mediante compensación de uniformidad) de muchos widegamut de bajísima calidad como la serie SW de Benq acabados en C y sus tipicos contrastes de 600:1 (prad.de).
Si la uniformidad o contraste del monitor son malos, no puede arreglarse. Sólo queda devolver a la tienda y comprar un producto de mayor calidad (que suele ir unido al precio).

Submit "FAQ VIII - Calibración LUT3D en Windows con cualquier monitor y GPU" to FaceBook Submit "FAQ VIII - Calibración LUT3D en Windows con cualquier monitor y GPU" to Twitter Submit "FAQ VIII - Calibración LUT3D en Windows con cualquier monitor y GPU" to Pinterest

Actualizado 06/07/21 a las 12:52:00 por ColorConsultant

Categories
Otros

Comentarios

  1. Avatar de PatrickBeierMainz
    Muchisimas gracias por tu entrad del blog y el trabajo explicando el tema. Solo que no te entendi. Uso displaycal con un colorimetro y calibro mi monitor versus 3Dlut creando un perfil ICC que se carga cada vez que enciendo mi pc.

    No entiendo como funciona esa nueva manera, sobretodo si Windows no conoce el monitor que uso. La referencia entonces cual es y como se mide la diferencia real del monitor para crear un perfil?

    Un saludo desde Alemania y gracias de nuevo por tus explicaciones

    Patrick
  2. Avatar de ColorConsultant
    Cuando creas una LUT3D con DisplayCAL le estas dando la "referencia de cómo debiera ser el monitor", es el source colorspace, por eso es perfil que puedes poner como ICC en el SO como perfil de pantalla tras cargar la LUT3D.
    El destiantion colorspace es el espacio de color del monitor "a corregir".

    Realmente funciona al revés, se reescriben los numeros RGB de source a destination (se recodifican los numeros RGB de source a los numeros RGB equivalentes en destination), pero a modo didáctico puedes pensar en ello como que el "destination" se transforma/calibra a "source". Repito, es al revés, pero mira a ver si explicado asi te sirve para entenderlo.