有人可以解释一下片段着色器吗?这是一个色度键过滤器(绿屏效果)

kil*_*kev 7 opengl colors glsl video-processing fragment-shader

我试图理解这个色度键过滤器是如何工作的.如果您不知道,色度键是绿屏效果.有人能够解释这些功能中的某些功能是如何工作的以及它们究竟在做什么?

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);
Run Code Online (Sandbox Code Playgroud)

我理解前6行(将颜色转换为替换,可能是绿色,纹理颜色转换为YCrCb颜色系统).

此片段着色器具有两个输入浮点值:thresholdSensitivity和Smoothing.

  • 阈值灵敏度控制着类似像素需要被替换的颜色.
  • 平滑控制如何在图像中逐渐替换相似的颜色.

我不明白这些值是如何在blendValue行中使用的.blendValue计算什么?blendValue行和gl_FragColor行如何实际创建绿屏效果?

rad*_*al7 4

GLSL 中的函数smoothstep计算一段区间内的平滑三次曲线(由前两个参数指定)。与 GLSL 的mix函数相比,GLSL 的参数线性混合为:

GLSL 的 <code>mix</code> 函数

smoothstep使用 Hermite 三次多项式来确定该值

GLSL 的 <code>smoothstep</code> 函数

在着色器中,blendValue是基于红色和蓝色色度值之间的距离的平滑值的平滑插值。

最后,gl_FragColor指定最终片段颜色(在混合之前,在片段着色器完成后发生)。在您的情况下,它是从输入图像读取的调制值,以及半透明度的调制 alpha 值。