深度偏移(Offset)

作者:追风剑情 发布于:2018-12-28 16:32 分类:Shader

参考原文 https://blog.csdn.net/cubesky/article/details/51881006

每一个Fragment的深度值都会增加如下所示的偏移量:
offset = (m * factor) + (r * units)
m是多边形的深度的斜率,多边形越接近与近裁剪面平行,m就越接近0。
r是一个常量。

factor值越小,模型就越接近摄像机
units值越小,模型就越接近摄像机
注意: 改变factor或units的值并不影响模型坐标位置,只影响ZTest。

示例

  1. Shader "Custom/OffsetTest"
  2. {
  3. Properties
  4. {
  5. _MainTex ("Texture", 2D) = "white" {}
  6.  
  7. _OffsetFactor ("OffsetFactor", Float) = 0
  8. _OffsetUnits ("OffsetUnits", Float) = 0
  9. }
  10. SubShader
  11. {
  12. Tags { "RenderType"="Opaque" }
  13. LOD 100
  14.  
  15. Offset [_OffsetFactor], [_OffsetUnits]
  16.  
  17. Pass
  18. {
  19. CGPROGRAM
  20. #pragma vertex vert
  21. #pragma fragment frag
  22. // make fog work
  23. #pragma multi_compile_fog
  24. #include "UnityCG.cginc"
  25.  
  26. struct appdata
  27. {
  28. float4 vertex : POSITION;
  29. float2 uv : TEXCOORD0;
  30. };
  31.  
  32. struct v2f
  33. {
  34. float2 uv : TEXCOORD0;
  35. UNITY_FOG_COORDS(1)
  36. float4 vertex : SV_POSITION;
  37. };
  38.  
  39. sampler2D _MainTex;
  40. float4 _MainTex_ST;
  41. v2f vert (appdata v)
  42. {
  43. v2f o;
  44. o.vertex = UnityObjectToClipPos(v.vertex);
  45. o.uv = TRANSFORM_TEX(v.uv, _MainTex);
  46. UNITY_TRANSFER_FOG(o,o.vertex);
  47. return o;
  48. }
  49. fixed4 frag (v2f i) : SV_Target
  50. {
  51. // sample the texture
  52. fixed4 col = tex2D(_MainTex, i.uv);
  53. // apply fog
  54. UNITY_APPLY_FOG(i.fogCoord, col);
  55. return col;
  56. }
  57. ENDCG
  58. }
  59. }
  60. }

效果

放两个模型,白色Cube挡在绿色Cube前面,然后调整绿色Cube的Offset值,看看效果。

777.png

1111.png2222.png

333.png444.png

555.png666.png

标签: Shader

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号