绿色 Chrome 使用深度的关键着色器

Green Chrome Key Shader using depth

我编写了一个着色器,可将 RGB 相机值转换为 HSV,然后对绿色应用一些过滤 chrome。 当前问题

  1. 如果前景(玩家)的物体有绿色像素,它将被剪掉。

  2. 我已经有深度摄像头了,如何使用那个 属性 来更好地切出 chrome 键?

    片段(v2f i):SV_Target { fixed4 col = tex2D(_MainTex, i.uv);

                 if (_ShowBackground)
                 {
                     fixed4 col2 = tex2D(_TexReplacer, i.uv);
                     col = col2;
                 }
                 else if (!_ShowOriginal)
                 {
                     fixed4 col2 = tex2D(_TexReplacer, i.uv);
    
                     float maskY = 0.2989 * _GreenColor.r + 0.5866 * _GreenColor.g + 0.1145 * _GreenColor.b;
                     float maskCr = 0.7132 * (_GreenColor.r - maskY);
                     float maskCb = 0.5647 * (_GreenColor.b - maskY);
    
                     float Y = 0.2989 * col.r + 0.5866 * col.g + 0.1145 * col.b;
                     float Cr = 0.7132 * (col.r - Y);
                     float Cb = 0.5647 * (col.b - Y);
    
                     float alpha = smoothstep(_Sensitivity, _Sensitivity + _Smooth, distance(float2(Cr, Cb), float2(maskCr, maskCb)));
    
                     col = (alpha * col) + ((1 - alpha) * col2);
                 }
                 return col;
             }
    

Unity 的 UnityObjectToClipPos(float3 pos) 可让您将顶点转换为剪辑 space。这意味着所有轴上的 01,z 轴是与渲染相机的距离(我相信从近到远的裁剪平面)。

您可以使用此距离来简单地将键控应用于比给定阈值更远的顶点。

如果您不想使用归一化坐标,您还可以使用 mul(unity_ObjectToWorld, vertex.position) 将顶点转换为世界 space,然后将世界位置乘以相机 space相机的世界到本地矩阵(您必须将其传递到着色器)。

要在着色器中访问相机的深度纹理,您可以使用 _CameraDepthTexture (请参阅文档 https://docs.unity3d.com/Manual/SL-CameraDepthTexture.html 部分着色器变量)。 您可以使用 tex2D(_CameraDepthTexture, i.uv);

像任何其他纹理一样对其进行采样