绿色 Chrome 使用深度的关键着色器
Green Chrome Key Shader using depth
我编写了一个着色器,可将 RGB 相机值转换为 HSV,然后对绿色应用一些过滤 chrome。
当前问题
如果前景(玩家)的物体有绿色像素,它将被剪掉。
我已经有深度摄像头了,如何使用那个 属性 来更好地切出 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。这意味着所有轴上的 0
到 1
,z 轴是与渲染相机的距离(我相信从近到远的裁剪平面)。
您可以使用此距离来简单地将键控应用于比给定阈值更远的顶点。
如果您不想使用归一化坐标,您还可以使用 mul(unity_ObjectToWorld, vertex.position)
将顶点转换为世界 space,然后将世界位置乘以相机 space相机的世界到本地矩阵(您必须将其传递到着色器)。
要在着色器中访问相机的深度纹理,您可以使用 _CameraDepthTexture
(请参阅文档 https://docs.unity3d.com/Manual/SL-CameraDepthTexture.html 部分着色器变量)。
您可以使用 tex2D(_CameraDepthTexture, i.uv);
像任何其他纹理一样对其进行采样
我编写了一个着色器,可将 RGB 相机值转换为 HSV,然后对绿色应用一些过滤 chrome。 当前问题
如果前景(玩家)的物体有绿色像素,它将被剪掉。
我已经有深度摄像头了,如何使用那个 属性 来更好地切出 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。这意味着所有轴上的 0
到 1
,z 轴是与渲染相机的距离(我相信从近到远的裁剪平面)。
您可以使用此距离来简单地将键控应用于比给定阈值更远的顶点。
如果您不想使用归一化坐标,您还可以使用 mul(unity_ObjectToWorld, vertex.position)
将顶点转换为世界 space,然后将世界位置乘以相机 space相机的世界到本地矩阵(您必须将其传递到着色器)。
要在着色器中访问相机的深度纹理,您可以使用 _CameraDepthTexture
(请参阅文档 https://docs.unity3d.com/Manual/SL-CameraDepthTexture.html 部分着色器变量)。
您可以使用 tex2D(_CameraDepthTexture, i.uv);