//========================================================== // // Copyright (c) Guangzhou Shixiang Technology Co.,Ltd. // All rights reserved. // //========================================================== /* 让物体显示在最前面 其实修改的就是SV_POSITION,也就是物体的屏幕坐标。在OpenGL里范围是[-1,1]。 它是一个相对值,表示距离相机的远近。修改Z值就是修改深度值,在处理遮挡时把Z值增加使其更靠近屏幕,就可以显示在最前面。 UNITY_REVERSED_Z: Unity为了计算深度时获得更高的精度,因此会有翻转Z轴的情况,所以会Z值变大反而距离屏幕越近。 UNITY_REVERSED_Z并不是所有平台都一致的。在DirectX 11, DirectX 12, PS4, Xbox One, Metal平台下会翻转Z轴,其他平台则不会。 在Android平台上应该减去一个值而不是加上一个值。 */ Shader "GxrSdk/Overlay" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _ZTestAddValue("ZTest Add Value",float) = 1 [Enum(UnityEngine.Rendering.CompareFunction)] _ZTest ("ZTest", Float) = 4 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 ZTest[_ZTest] Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct vertexOutput { float4 pos : SV_POSITION; float4 posInObjectCoords : TEXCOORD0; }; float _ZTestAddValue; vertexOutput vert(appdata_full input) { vertexOutput output; float4 clipPos = UnityObjectToClipPos(input.vertex); // 计算深度时额外增加一个值 #if UNITY_REVERSED_Z clipPos.z += _ZTestAddValue; clipPos.z = min(clipPos.z, clipPos.w * UNITY_NEAR_CLIP_VALUE); //限定在范围内 #else clipPos.z -= _ZTestAddValue; clipPos.z = max(clipPos.z, clipPos.w * UNITY_NEAR_CLIP_VALUE);//限定在范围内 #endif output.pos = clipPos; output.posInObjectCoords = input.texcoord; return output; } sampler2D _MainTex; fixed4 _Color; float4 frag(vertexOutput input) : COLOR { float4 col = tex2D(_MainTex, input.posInObjectCoords) * _Color; return col; } ENDCG } } FallBack "Diffuse" }