我试图了解这个色度键过滤器的工作原理。如果您不知道,色度键是绿屏效果。是否有人能够解释其中某些功能是如何工作的以及它们究竟在做什么?
float maskY = 0.2989 * colorToReplace.r + 0.5866 * colorToReplace.g + 0.1145 * colorToReplace.b;
float maskCr = 0.7132 * (colorToReplace.r - maskY);
float maskCb = 0.5647 * (colorToReplace.b - maskY);
float Y = 0.2989 * textureColor.r + 0.5866 * textureColor.g + 0.1145 * textureColor.b;
float Cr = 0.7132 * (textureColor.r - Y);
float Cb = 0.5647 * (textureColor.b - Y);
float blendValue = smoothstep(thresholdSensitivity, thresholdSensitivity + smoothing, distance(vec2(Cr, Cb), vec2(maskCr, maskCb)));
gl_FragColor = vec4(textureColor.rgb * blendValue, 1.0 * blendValue);
我理解前6行(将颜色转换为替换,可能是绿色,纹理颜色转换为YCrCb颜色系统)。
此片段着色器有两个输入浮点值:thresholdSensitivity和Smoothing。
我不明白这些值是如何在blendValue行中使用的。 blendValue计算什么? blendValue行和gl_FragColor行如何实际创建绿屏效果?
答案 0 :(得分:3)
GLSL中的smoothstep
函数评估一个区间(由前两个参数指定)的平滑三次曲线。与GLSL的mix
函数相比,它将其参数线性混合为:
smoothstep
使用Hermite三次多项式来确定值
在着色器中, blendValue 是基于红色和蓝色色度值之间距离的平滑值的平滑插值。
最后,gl_FragColor
指定最终片段颜色(在混合之前,在片段着色器完成之后发生)。在您的情况下,它是从输入图像读取的调制值,以及半透明的调制alpha值。