在这个例子中难以理解点积的使用?

时间:2011-06-05 03:18:13

标签: vector glsl

通常,我使用2个向量的点积来确定它们的垂直度或它们之间角度的余弦。在这个着色器中,一个香椿着色器,点积用于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 个答案:

答案 0 :(得分:9)

在这种情况下,“几何”标量(点)产品属性并不重要。你在这里有一个普通的(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处的原始颜色(从gl_FragCoord.xy处的RGB值中减去灰度值)。没有背景,所有这一切的目的并不完全清楚。