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);
Другие вопросы по тегам