GreenScreenShader.shader 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. Shader "DX11/GreenScreenShader" {
  2. SubShader {
  3. Pass {
  4. CGPROGRAM
  5. #pragma target 5.0
  6. #pragma vertex vert
  7. #pragma fragment frag
  8. #include "UnityCG.cginc"
  9. Texture2D _MainTex;
  10. sampler SampleType;
  11. struct vs_input {
  12. float4 pos : POSITION;
  13. float2 tex : TEXCOORD0;
  14. };
  15. StructuredBuffer<float2> depthCoordinates;
  16. StructuredBuffer<float> bodyIndexBuffer;
  17. struct ps_input {
  18. float4 pos : SV_POSITION;
  19. float2 tex : TEXCOORD0;
  20. };
  21. ps_input vert (vs_input v)
  22. {
  23. ps_input o;
  24. o.pos = mul (UNITY_MATRIX_MVP, v.pos);
  25. o.tex = v.tex;
  26. // Flip x texture coordinate to mimic mirror.
  27. o.tex.x = 1 - v.tex.x;
  28. return o;
  29. }
  30. float4 frag (ps_input i, in uint id : SV_InstanceID) : COLOR
  31. {
  32. float4 o;
  33. int colorWidth = (int)(i.tex.x * (float)1920);
  34. int colorHeight = (int)(i.tex.y * (float)1080);
  35. int colorIndex = (int)(colorWidth + colorHeight * (float)1920);
  36. o = float4(0, 1, 0, 1);
  37. if ((!isinf(depthCoordinates[colorIndex].x) && !isnan(depthCoordinates[colorIndex].x) && depthCoordinates[colorIndex].x != 0) ||
  38. !isinf(depthCoordinates[colorIndex].y) && !isnan(depthCoordinates[colorIndex].y) && depthCoordinates[colorIndex].y != 0)
  39. {
  40. // We have valid depth data coordinates from our coordinate mapper. Find player mask from corresponding depth points.
  41. float player = bodyIndexBuffer[(int)depthCoordinates[colorIndex].x + (int)(depthCoordinates[colorIndex].y * 512)];
  42. if (player != 255)
  43. {
  44. o = _MainTex.Sample(SampleType, i.tex);
  45. }
  46. }
  47. return o;
  48. }
  49. ENDCG
  50. }
  51. }
  52. Fallback Off
  53. }