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

Unity3d 使用深度的绿色Chrome关键帧着色器,unity3d,gpu,shader,fragment-shader,Unity3d,Gpu,Shader,Fragment Shader,我写了一个着色器,它将RGB摄影机值转换为HSV,然后对绿色铬应用一些过滤。 当前问题 如果前景中的对象(播放器)有绿色像素,它将被切掉 我已经有了深度相机,我怎样才能用它来制作一个更好的chrome按键呢 frag(v2f i):SV_目标 { 固定4列=tex2D(_MainTex,i.uv) Unity的UnityObjectToClipPos(float3 pos)让我们将顶点转换为剪辑空间。这意味着0到1在所有轴上,z轴是到渲染摄影机的距离(我相信是从近到远的剪辑平面) 可以使用此

我写了一个着色器,它将RGB摄影机值转换为HSV,然后对绿色铬应用一些过滤。 当前问题

  • 如果前景中的对象(播放器)有绿色像素,它将被切掉

  • 我已经有了深度相机,我怎样才能用它来制作一个更好的chrome按键呢

    frag(v2f i):SV_目标 { 固定4列=tex2D(_MainTex,i.uv)


  • Unity的
    UnityObjectToClipPos(float3 pos)
    让我们将顶点转换为剪辑空间。这意味着
    0
    1
    在所有轴上,z轴是到渲染摄影机的距离(我相信是从近到远的剪辑平面)

    可以使用此距离仅将关键帧应用于超出给定阈值的顶点

    如果不想使用规范化坐标,还可以使用
    mul(unity\u ObjectToWorld,vertex.position)
    将顶点转换为世界空间,然后将世界位置与摄影机的世界相乘,转换为摄影机空间到局部矩阵(必须传递到着色器)

    要在着色器中访问摄影机的深度纹理,可以使用
    \u CameraDepthTexture
    (请参阅文档部分着色器变量)。
    您可以使用
    tex2D(\u CameraDepthTexture,i.uv)像其他纹理一样对其进行采样

    我已经有了一个深度摄影机,你能解释一下这和你的答案有什么关系吗?我很困惑,谢谢,你能给我一个伪代码吗?例如,如果我能从着色器中的一个函数中获得深度像素,我怎么能使用frag着色器从阈值距离中丢弃像素?如果(currentDepth注意,应该避免着色器中的
    if-else
    语句。为此,可以使用
    步骤(…)
                 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;
             }