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 с ошибкой