OVRMRCameraFrameLit.shader 2.77 KB
Shader "Oculus/OVRMRCameraFrameLit" {
	Properties{
		_Color("Color", Color) = (1,1,1,1)
		_MainTex("Albedo (RGB)", 2D) = "white" {}
		_DepthTex("Depth (cm)", 2D) = "black" {}
		_InconfidenceTex("Inconfidence (0-100)", 2D) = "black" {}
		_Visible("Visible", Range(0.0,1.0)) = 1.0
	}
	SubShader{
		Tags{ "Queue" = "Transparent" "RenderType" = "Transparent" }
		LOD 200

		CGPROGRAM
		#pragma surface surf Lambert alpha:fade
		#pragma target 3.0

		#include "OVRMRChromaKey.cginc"

		#define TEST_ENVIRONMENT			0

		sampler2D _MainTex;
		sampler2D _DepthTex;
		sampler2D _MaskTex;

		float4 _TextureDimension;		// (w, h, 1/w, 1/h)
		float4 _TextureWorldSize;	  // (width_in_meter, height_in_meter, 0, 0)

		float _SmoothFactor;
		float _DepthVariationClamp;

		float _CullingDistance;

		struct Input {
		#if TEST_ENVIRONMENT
			float2 uv_MainTex;
		#endif
			float4 screenPos;
		};

		fixed4 _Color;
		fixed  _Visible;
		float4 _FlipParams;		// (flip_h, flip_v, 0, 0)

		fixed GetMask(float2 uv)
		{
			return tex2D(_MaskTex, uv).r;
		}

		fixed4 GetCameraColor(float2 colorUV)
		{
			fixed4 c = tex2D(_MainTex, colorUV) * _Color;
			return c;
		}

		float GetDepth(float2 uv)
		{
			float depth = tex2D(_DepthTex, uv).x * 1.0 / 100;
			return depth;
		}

		float3 GetNormal(float2 uv)
		{
			float dz_x = GetDepth(uv + float2(_TextureDimension.z, 0)) - GetDepth(uv - float2(_TextureDimension.z, 0));
			float dz_y = GetDepth(uv + float2(0, _TextureDimension.w)) - GetDepth(uv - float2(0, _TextureDimension.w));
			dz_x = clamp(dz_x, -_DepthVariationClamp, _DepthVariationClamp);
			dz_y = clamp(dz_y, -_DepthVariationClamp, _DepthVariationClamp);
			//float dist = 0.01;
			//float3 normal = cross(float3(dist, 0, dz_x), float3(0, dist, dz_y));
			float3 normal = cross(float3(_TextureWorldSize.x * _TextureDimension.z * 2.0 * _SmoothFactor, 0, dz_x), float3(0, _TextureWorldSize.y * _TextureDimension.w * 2.0 * _SmoothFactor, dz_y));
			normal = normalize(normal);
			return normal;
		}

		void surf(Input IN, inout SurfaceOutput o) {
	#if TEST_ENVIRONMENT
			float2 colorUV = float2(IN.uv_MainTex.x, IN.uv_MainTex.y);
	#else
			float2 screenUV = IN.screenPos.xy / IN.screenPos.w;
			float2 colorUV = float2(screenUV.x, 1.0 - screenUV.y);
	#endif
			if (_FlipParams.x > 0.0)
			{
				colorUV.x = 1.0 - colorUV.x;
			}
			if (_FlipParams.y > 0.0)
			{
				colorUV.y = 1.0 - colorUV.y;
			}
			float mask = GetMask(colorUV);
			if (mask == 0.0)
			{
				discard;
			}
			float4 col = GetColorAfterChromaKey(colorUV, _TextureDimension.zw, 1.0);
			if (col.a < 0.0)
			{
				discard;
			}
			float depth = GetDepth(colorUV);
			if (depth > _CullingDistance)
			{
				discard;
			}
			float3 normal = GetNormal(colorUV);
			o.Albedo = col.rgb;
			o.Normal = normal;
			o.Alpha = col.a *_Visible;
		}
		ENDCG
	}
	FallBack "Alpha-Diffuse"
}