README.md

    ColorTemp

    Реализации алгоритма для преобразования температуры Цельсия или Кельвина в RGB цвет в диапазоне от 0 до 40000 градусов по Кельвину, или от -273 до 39726 градусов по Цельсию. Эти ограничения заложены в код так что если задать значения выше или ниже пороговых они будут приведены к указаным диапазонам. Почему именно так читайте в статье по алгоритму. Этот алгоритм годится только для визуальных эффектов и коррекции цвета

    tempcolorcat

    Значения по Кельвину < 500 и по Цельсию < 275 будут давать один цвет равный

    • R = 255 G = 0 B = 0

    так что лимиты от абсолютного нуля имеют мало смысла и добавлены только ради удобства. Значения по Кельвину больше чем 40000 и по Цельсию больше чем 39726 имеют цвет

    • R = 151 G = 185 B = 255

    дальнейшее увеличение не имеет смысла, имеет смысл от 500 до 40000 по Кельвину

    Алгоритм придуман Tanner Helland с его описанием можно ознакомиться по ссылке:

    Реализации

    Реализаций алгоритма три Lua, C, GLSL не вижу смысла делить их на отдельные репозитории так как подразумевается просто встраивание реализаций, а не установка

    Lua

    В каталоге colortemp-lua для удобства является уже готовым модулем для подключения

    • Любая версия Lua:
      • Luajit
      • Lua5.1
      • Lua5.2
      • Lua5.3
      • Lua5.4

    Пример

    main.lua

    local colortemp = require('colortemp')
    
    -- Kelvin : min =    0, max = 40000
    -- Celsius: min = -273, max = 39726
    
    -- Output color range 0 - 255
    
    local rk, gk, bk = colortemp.kelvin_to_rgb(1600)  -- Kelvin  temperature to RGB
    local rc, gc, bc = colortemp.celsius_to_rgb(1327) -- Celsius temperature to RGB
    
    print('Kelvin  RGB:',rk,gk,bk)
    print('Celsius RGB:',rc,gc,bc)
    
    
    lua main.lua
    

    GLSL

    В каталоге colortemp-glsl предполагается что код будет просто скопирован в шейдер Проверял на версии GLSL #version 120 должно работать везде

    Пример

    shader.frag

    
    /* copy glsl code from colortemp.glsl here */
    
    void main()
    {
      /* Kelvin : min =    0, max = 40000 */
      /* Celsius: min = -273,  max = 39726 */
    
      /* Output color range 0.0 - 1.0     */
    
      vec3 color_k = kelvin_to_rgb(1600.0);  /* Kelvin  temperature to RGB */
      vec3 color_c = celsius_to_rgb(1327.0); /* Celsius temperature to RGB */
    
      gl_FragColor = vec4(color_k, 1.0);     /* Draw color temperature on screen*/
    }
    

    C

    В каталоге colortemp-c оформлено в виде пары colortemp.c и colortemp.h для включения в виде отдельной компилирумемой единицы или сборки в библиотеку.

    Пример

    main.c

    #include <stdio.h>
    #include "colortemp.h"
    
    int main(int argc, char ** argv)
    {
      /* Kelvin : min =    0, max = 40000 */
      /* Celsius: min = -273, max = 39726 */
    
      /* Output color range 0 - 255 in {uint8_t r, uint8_t g, uint8_t b } */
    
      struct rgb k = kelvin_to_rgb(1600.f);  /* Kelvin  temperature to RGB */
      struct rgb c = celsius_to_rgb(1327.f); /* Celsius temperature to RGB */
    
      printf("Kelvin  RGB: %u %u %u\n",k.r,k.g,k.b);
      printf("Celsius RGB: %u %u %u\n",c.r,c.g,c.b);
    
      return 0;
    }
    
    
    gcc colortemp.c main.c -o app -lm
    ./app
    

    На заметку

    Реализации не отличаются какой-то оптимизацией, я их сделал для себя. Да и смысл оптимизировать есть разве что код для GLSL, хотя навреное будет лучше если расчёт будет производится не шейдером, а вычисляться заранее и передаваться в шейдер через uniform так как для баланса температуры цвета нужно вычислить значение цветовой температуры лишь 1 раз и применять полученое значение ко всем образабываемым пикселям/текселям, в случае если такая обработка происходит конечно.

    Спасибо dataman'у который поделился ссылкой и предложил впихнуть этот алгоритм для расскрашивания часов clockrip :D

    Описание

    Преобразование температуры в RGB цвет на Lua, C и GLSL

    Конвейеры
    0 успешных
    0 с ошибкой