通常,我使用 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/