CIKernel White Pixel с GLSL - PullRequest
       46

CIKernel White Pixel с GLSL

0 голосов
/ 30 апреля 2018

У меня есть 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 Ответ

0 голосов
/ 30 апреля 2018

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))); 

В этом случае вместо clamp(lightCol.rgb, 0.0, 1.0) может использоваться min(vec3(1.0), lightCol.rgb).

Если хорошо известно, что каждый из трех цветовых каналов равен <= 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);
...