using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace com.rfilkov.kinect
{
///
/// BackgroundRemovalByGreenScreen filters color camera data, according to its similarity or difference to the color of the green-screen.
///
public class BackgroundRemovalByGreenScreen : MonoBehaviour
{
[Tooltip("The color of the 'green screen'.")]
public Color greenScreenColor = Color.green;
[Tooltip("Allowed similarity between the 'green screen' color and the texture color.")]
public float greenScreenColorRange = 0.5f;
[Tooltip("Alpha values below this value will be set to fully transparent.")]
[Range(0f, 1f)]
public float setAsTransparentBelow = 0f;
[Tooltip("Alpha values above this value will be set to fully opaque.")]
[Range(0f, 1f)]
public float setAsOpaqueAbove = 1f;
[Tooltip("Green screen rectangle in normalized coordinates (between 0 and 1).")]
public Rect greenScreenRect = new Rect(0, 0, 1, 1);
// foreground filter shader
private ComputeShader foregroundFilterShader = null;
private int foregroundFilterKernel = -1;
// initializes background removal shaders
public bool InitBackgroundRemoval(KinectInterop.SensorData sensorData)
{
if (sensorData != null && sensorData.colorImageWidth > 0 && sensorData.colorImageHeight > 0)
{
foregroundFilterShader = Resources.Load("ForegroundFiltGreenScreenShader") as ComputeShader;
foregroundFilterKernel = foregroundFilterShader != null ? foregroundFilterShader.FindKernel("FgFiltFreenScreen") : -1;
return true;
}
return false;
}
//// releases background removal shader resources
//public void FinishBackgroundRemoval(KinectInterop.SensorData sensorData)
//{
//}
///
/// Applies foreground filter by green screen.
///
public void ApplyForegroundFilterByGreenScreen(RenderTexture alphaTexture, KinectInterop.SensorData sensorData,
KinectManager kinectManager, RenderTexture colorTexture)
{
if (foregroundFilterShader != null && colorTexture != null && alphaTexture != null)
{
foregroundFilterShader.SetVector("_GreenScreenColor", greenScreenColor);
foregroundFilterShader.SetFloat("_GreenScreenColorRange", greenScreenColorRange);
foregroundFilterShader.SetTexture(foregroundFilterKernel, "_ColorTex", colorTexture);
foregroundFilterShader.SetTexture(foregroundFilterKernel, "_AlphaTex", alphaTexture);
foregroundFilterShader.SetFloat("_SetTranspBelow", setAsTransparentBelow);
foregroundFilterShader.SetFloat("_SetOpaqueAbove", setAsOpaqueAbove);
float xMin = sensorData.colorImageScale.x > 0 ? greenScreenRect.xMin * colorTexture.width : (1f - greenScreenRect.xMax) * colorTexture.width;
float yMin = sensorData.colorImageScale.y > 0 ? greenScreenRect.yMin * colorTexture.height : (1f - greenScreenRect.yMax) * colorTexture.height;
float xMax = sensorData.colorImageScale.x > 0 ? greenScreenRect.xMax * colorTexture.width : (1f - greenScreenRect.xMin) * colorTexture.width;
float yMax = sensorData.colorImageScale.y > 0 ? greenScreenRect.yMax * colorTexture.height : (1f - greenScreenRect.yMin) * colorTexture.height;
Vector4 vGreenScreenRect = new Vector4(xMin, yMin, xMax, yMax);
foregroundFilterShader.SetVector("_GreenScreenRect", vGreenScreenRect);
//Debug.Log(vGreenScreenRect);
foregroundFilterShader.Dispatch(foregroundFilterKernel, alphaTexture.width / 8, alphaTexture.height / 8, 1);
//Debug.Log("ApplyForegroundFilterByGreenScreen()");
}
}
}
}