«Геометрические» скалярные (точечные) свойства продукта в данном случае не имеют большого значения. Здесь у вас есть обычное преобразование цвета (R, G, B)
в соответствующую интенсивность оттенков серого I
в соответствии с формулой
I = R * 0.30 + G * 0.59 + B * 0.11
(Вы можете узнать больше об этих коэффициентах здесь: https://en.wikipedia.org/wiki/Grayscale#Luma_coding_in_video_systems).
Как вы сразу видите, эта формула выглядит как скалярное произведение двух векторов: один - наш цвет (R, G, B)
, а другой - (0.30, 0.59, 0.11)
. Таким образом, автор кода просто использовал функцию «скалярное произведение», чтобы оценить эту формулу для четырех различных значений цвета, полученных в четырех разных точках: точка gl_FragCoord.xy
смещена в четырех разных направлениях (как образец x
).
Другими словами, скалярное произведение в этом случае не используется на «двух цветах», как вы, казалось, изначально предполагали. Он используется для цвета (пиксель взят из backBuffer
в некоторых координатах) и вектора коэффициента преобразования (0.30, 0.59, 0.11)
(точно названного to_gray
). Последний не совсем цвет. Это просто вектор коэффициентов преобразования. Вы можете думать об этом как о «цвете», если хотите, но в этом нет особого смысла.
Вот и все для точечного произведения.
Затем они делают некоторые дополнительные вычисления, чтобы объединить четыре значения в градациях серого в одно значение в градациях серого. Затем они используют это значение в градациях серого для изменения исходного цвета в точке gl_FragCoord.xy
(значения серого вычитаются из значений RGB в gl_FragCoord.xy
). Цель всего этого не совсем ясна без контекста.