Проблемы с пониманием использования точечного продукта в этом примере? - PullRequest
4 голосов
/ 05 июня 2011

Обычно я использую скалярное произведение двух векторов, чтобы узнать, насколько они перпендикулярны, или косинус угла между ними.В этом шейдере, Toon Shader, точечный продукт используется в 2 цветах, и я не могу обернуться вокруг того, что именно он делает.

uniform vec2 resolution;
uniform sampler2D backBuffer;

void main(void)
{

  vec4 to_gray = vec4(0.3,0.59,0.11,0);
  float x1 = dot(to_gray,  texture2D(backBuffer,vec2((gl_FragCoord.xy
      + vec2(1.0,1.0)) /resolution.xy)).rgba);
  float x0 = dot(to_gray,  texture2D(backBuffer,vec2((gl_FragCoord.xy
      + vec2(-1.0,-1.0)) /resolution.xy)).rgba);
  float x3 = dot(to_gray,  texture2D(backBuffer,vec2((gl_FragCoord.xy
      + vec2(1.0,-1.0)) /resolution.xy)).rgba);
  float x2 = dot(to_gray,  texture2D(backBuffer,vec2((gl_FragCoord.xy
      + vec2(-1.0,1.0)) /resolution.xy)).rgba);
  float edge = (x1 - x0) * (x1 - x0);
  float edge2 = (x3 - x2) * (x3 - x2);
  edge += edge2;
  vec4 color =  texture2D(backBuffer,vec2(gl_FragCoord.xy  / resolution.xy));

    gl_FragColor = max(color - vec4(edge, edge, edge, edge) * 12.0,
        vec4(0,0,0,color.a));
}

1 Ответ

9 голосов
/ 05 июня 2011

«Геометрические» скалярные (точечные) свойства продукта в данном случае не имеют большого значения. Здесь у вас есть обычное преобразование цвета (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). Цель всего этого не совсем ясна без контекста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...