113 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 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"
 | |
| }
 |