1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- //==========================================================
- //
- // 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"
- }
|