在此示例中难以理解点积的使用?

jma*_*erx 4 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));
}
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 9

在这种情况下,"几何"标量(点)产品属性并不重要.你在这里有一个普通的(R, G, B)颜色转换为相应的灰度强度I根据公式

I = R * 0.30 + G * 0.59 + B * 0.11
Run Code Online (Sandbox Code Playgroud)

(您可以在此处了解有关这些系数的更多信息: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).后者实际上并不是一种颜色.它只是转换系数的向量.如果你愿意,你可以把它想象成一种"颜色",但它没有多大意义.

这就是dot产品.

然后,他们进行一些额外的计算,将四个灰度值组合成一个灰度值.然后,他们使用该灰度值来修改点处的原始颜色gl_FragCoord.xy(灰度值从RGB值中减去gl_FragCoord.xy).没有背景,所有这一切的目的并不完全清楚.