GxrOverlay.shader 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. //==========================================================
  2. //
  3. // Copyright (c) Guangzhou Shixiang Technology Co.,Ltd.
  4. // All rights reserved.
  5. //
  6. //==========================================================
  7. /*
  8. 让物体显示在最前面
  9. 其实修改的就是SV_POSITION,也就是物体的屏幕坐标。在OpenGL里范围是[-1,1]。
  10. 它是一个相对值,表示距离相机的远近。修改Z值就是修改深度值,在处理遮挡时把Z值增加使其更靠近屏幕,就可以显示在最前面。
  11. UNITY_REVERSED_Z: Unity为了计算深度时获得更高的精度,因此会有翻转Z轴的情况,所以会Z值变大反而距离屏幕越近。
  12. UNITY_REVERSED_Z并不是所有平台都一致的。在DirectX 11, DirectX 12, PS4, Xbox One, Metal平台下会翻转Z轴,其他平台则不会。
  13. 在Android平台上应该减去一个值而不是加上一个值。
  14. */
  15. Shader "GxrSdk/Overlay"
  16. {
  17. Properties
  18. {
  19. _Color ("Color", Color) = (1,1,1,1)
  20. _MainTex ("Albedo (RGB)", 2D) = "white" {}
  21. _ZTestAddValue("ZTest Add Value",float) = 1
  22. [Enum(UnityEngine.Rendering.CompareFunction)] _ZTest ("ZTest", Float) = 4
  23. }
  24. SubShader
  25. {
  26. Tags
  27. {
  28. "RenderType"="Opaque"
  29. }
  30. LOD 200
  31. ZTest[_ZTest]
  32. Pass
  33. {
  34. CGPROGRAM
  35. #pragma vertex vert
  36. #pragma fragment frag
  37. #include "UnityCG.cginc"
  38. struct vertexOutput
  39. {
  40. float4 pos : SV_POSITION;
  41. float4 posInObjectCoords : TEXCOORD0;
  42. };
  43. float _ZTestAddValue;
  44. vertexOutput vert(appdata_full input)
  45. {
  46. vertexOutput output;
  47. float4 clipPos = UnityObjectToClipPos(input.vertex);
  48. // 计算深度时额外增加一个值
  49. #if UNITY_REVERSED_Z
  50. clipPos.z += _ZTestAddValue;
  51. clipPos.z = min(clipPos.z, clipPos.w * UNITY_NEAR_CLIP_VALUE); //限定在范围内
  52. #else
  53. clipPos.z -= _ZTestAddValue;
  54. clipPos.z = max(clipPos.z, clipPos.w * UNITY_NEAR_CLIP_VALUE);//限定在范围内
  55. #endif
  56. output.pos = clipPos;
  57. output.posInObjectCoords = input.texcoord;
  58. return output;
  59. }
  60. sampler2D _MainTex;
  61. fixed4 _Color;
  62. float4 frag(vertexOutput input) : COLOR
  63. {
  64. float4 col = tex2D(_MainTex, input.posInObjectCoords) * _Color;
  65. return col;
  66. }
  67. ENDCG
  68. }
  69. }
  70. FallBack "Diffuse"
  71. }