通常,我使用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));
}
答案 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值中减去灰度值)。没有背景,所有这一切的目的并不完全清楚。