//clipPos.w = 1, viewPos.z = -1 float2 ClipXYToViewXY(float2 clipXY) { //clipXY.xy = mad(1, UNITY_MATRIX_P._m02_m12, clipXY.xy); clipXY.xy += UNITY_MATRIX_P._m02_m12; return float2(clipXY.x / UNITY_MATRIX_P._m00, clipXY.y / UNITY_MATRIX_P._m11); } float2 InverseTransformStereoScreenSpaceTex(float2 uv, float w) { #if UNITY_SINGLE_PASS_STEREO float4 scaleOffset = unity_StereoScaleOffset[unity_StereoEyeIndex]; uv.xy = mad(scaleOffset.zw, -w, uv.xy); return uv.xy / scaleOffset.xy; #else return uv; #endif } float2 InverseTransformStereoScreenSpaceTex(float2 uv) { #if UNITY_SINGLE_PASS_STEREO return InverseTransformStereoScreenSpaceTex(saturate(uv), 1); #else return uv; #endif } float PreComputeLinearEyeDepthFactor(in float3 viewPos){ return mad( //mad(viewPos.x , UNITY_MATRIX_P._m20 , viewPos.y * UNITY_MATRIX_P._m21), viewPos.x * UNITY_MATRIX_P._m20 + viewPos.y * UNITY_MATRIX_P._m21 , //dot(viewPos.xy,UNITY_MATRIX_P._m20_m21), rcp(viewPos.z) , UNITY_MATRIX_P._m22 ); } //W = 1 float2 GrabUVToClipXY(float2 grabUV) { float2 o; o.xy = InverseTransformStereoScreenSpaceTex(grabUV); #if UNITY_UV_STARTS_AT_TOP o.x = mad(o.x, 2, -1); o.y = mad(o.y, -2, 1); #else o.xy = mad(o.xy, 2, -1); #endif return o; } ///W = 1 float2 ScreenUVToClipXY(float2 screenUV) { float2 o; o.xy = InverseTransformStereoScreenSpaceTex(screenUV); o.xy = mad(o.xy, 2, -1); o.y *= _ProjectionParams.x; return o; } float LinearEyeDepth(in float zBuffer,in float linearEyeDepthFactor){ return UNITY_MATRIX_P._m23 /(linearEyeDepthFactor + zBuffer); } float LinearEyeDepth(in float zBuffer,in float3 viewPos) { return LinearEyeDepth(zBuffer,PreComputeLinearEyeDepthFactor(viewPos)); } //viewXY = viewPos.xy/ -viewPos.z float PreComputeLinearEyeDepthFactorViewXY(float2 viewXY){ //return dot(viewXY,-UNITY_MATRIX_P._m20_m21) + UNITY_MATRIX_P._m22; return mad(viewXY.x , -UNITY_MATRIX_P._m20, mad(viewXY.y , -UNITY_MATRIX_P._m21 , UNITY_MATRIX_P._m22)); //return (viewXY.x * -UNITY_MATRIX_P._m20+viewXY.y * -UNITY_MATRIX_P._m21) + UNITY_MATRIX_P._m22; } //viewXY = viewPos.xy/ -viewPos.z float LinearEyeDepthViewXY(float zBuffer, float2 viewXY) { return LinearEyeDepth(zBuffer,PreComputeLinearEyeDepthFactorViewXY(viewXY)); } float LinearEyeDepthScreenUV(float zBuffer, float2 screenUV) { float2 viewXY = ClipXYToViewXY(ScreenUVToClipXY(screenUV)); return LinearEyeDepthViewXY(zBuffer, viewXY); } float LinearEyeDepthGrabUV(float zBuffer, float2 grabUV) { float2 viewXY = ClipXYToViewXY(GrabUVToClipXY(grabUV)); return LinearEyeDepthViewXY(zBuffer, viewXY); //return LinearEyeDepth(zBuffer,ClipXYWToViewPos( GrabUVToClipXYW(grabUV,1))); }