8

我试图了解这个色度键过滤器是如何工作的。色度键,如果你不知道的话,就是一个绿屏效果。有人能够解释其中一些功能是如何工作的以及它们到底在做什么吗?

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 线实际上是如何创建绿屏效果的?

4

1 回答 1

4

GLSL 中的smoothstep函数在一个区间(由前两个参数指定)上评估平滑三次曲线。与 GLSL 的mix函数相比,它将其参数线性混合为:

GLSL 的 <code>mix</code> 功能

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

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

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

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

于 2013-06-04T06:17:46.657 回答