CIKernel White Pixel с GLSL
У меня есть CIKernal порогового фильтра в GLSL, как это:
let thresholdKernel = CIColorKernel(string:
"kernel vec4 thresholdFilter(__sample pixel, float threshold)" +
"{ " +
" float luma = (pixel.r * 0.2126) + " +
" (pixel.g * 0.7152) + " +
" (pixel.b * 0.0722); " +
" return vec4(step(threshold, luma)); " +
"} "
)”
Я хочу проверить, белый ли пиксель. Есть ли в GLSL простая команда, чтобы сделать это без дополнительных вычислений?
Обновление ** Хочу избавиться от расчета яркости. Так есть ли способ проверить, чтобы пиксель был белым, не делая выше вычисления яркости?
1 ответ
Th oixel является "белым", если каждый из каналов цвета дерева >= 1.0
, Это можно проверить, протестировав, если сумма цветовых каналов равна 3,0. Конечно, необходимо обеспечить, чтобы три цветовых канала были ограничены первыми 1,0:
bool is_white = dot(vec3(1.0), clamp(lightCol.rgb, 0.0, 1.0)) > 2.999;
или же
float white = step(2.999, dot(vec3(1.0), clamp(lightCol.rgb, 0.0, 1.0)));
В этом случае min(vec3(1.0), lightCol.rgb)
можно использовать вместо clamp(lightCol.rgb, 0.0, 1.0)
тоже.
Если хорошо известно, что каждый из трех цветовых каналов <= 1.0
тогда выражение можно упростить:
dot(vec3(1.0), lightCol.rgb) > 2.999
Обратите внимание, что в этом случае dot
продукт рассчитывает:
1.0*lightCol.r + 1.0*lightCol.g + 1.0*lightCol.b
а также luma
можно рассчитать следующим образом:
float luma = dot(vec3(0.2126, 0.7152, 0.0722), lightCol.rgb);