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