通常,我使用 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));
}

最佳答案

在这种情况下,“几何”标量(点)产品属性并不重要。你这里有的是根据公式将一些(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 值中减去灰度值)。如果没有上下文,所有这一切的目的是不完全清楚的。

关于vector - 无法理解本示例中点积的使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6240804/

10-11 16:08