当前位置:   article > 正文

Unity URP管线之Cull(表面剔除) Cull off & Cull back & Cull Front_unity shader cull

unity shader cull

介绍UnityShader的表面剔除(表面剪裁)技术

ShaderLab Cull命令

shaderLab语句说明
Cull Off不剔除
Cull Back(默认)剔除背面(内表面)
Cull Front剔除正面(外表面)

什么是表面剔除?为什么要进行表面剔除?

当一个mesh组件的信息被传递后,我们可以通过代码决定哪些部分渲染(render)出来,而哪些部分不要,这个过程就像把那些不要的部分剔除了,我们看不到他,虽然他的mesh信息还在,但是我们的GPU不会去处理它,肯定比剔除前GPU的性能消耗要低。
这个过程就好比我们的mesh组件是一个透明的膜,我们假设这个胶纸我们根本看不到,而片段着色器在着色的时候像毛笔选择性地上色,最后的效果是我们可能看到膜的一部分是可见的,但是不见的地方,膜还是存在的,只是我们没有给他上色,我们既看不看他们,也不需要再他们上面画宝贵的墨水(GPU并行处理能力)
引用自:
(原) 解读Unity中的CG编写Shader系列3——表面剔除与剪裁模式

表面剔除效果测试示例

一个Cull的应用实例-物体的外描边

代码
  1. Shader "Hidden/Outline"
  2. {
  3. Properties
  4. {
  5. _MainTex ("Texture", 2D) = "white" {}
  6. _OutlineWidth ("outline width", Float) = 0
  7. _OutlineColor ("outline color", Color) = (1,1,1,1)
  8. }
  9. SubShader
  10. {
  11. Cull Off
  12. //使用cull front把外表面裁掉
  13. Pass
  14. {
  15. name "InnerFace"
  16. Cull Front
  17. CGPROGRAM
  18. #pragma vertex vert
  19. #pragma fragment frag
  20. #include "UnityCG.cginc"
  21. struct appdata
  22. {
  23. float4 vertex : POSITION;
  24. float2 uv : TEXCOORD0;
  25. float4 normal : NORMAL;
  26. };
  27. struct v2f
  28. {
  29. float2 uv : TEXCOORD0;
  30. float4 vertex : SV_POSITION;
  31. };
  32. float _OutlineWidth;
  33. v2f vert (appdata v)
  34. {
  35. v2f o;
  36. o.vertex = UnityObjectToClipPos(v.vertex+v.normal*float4(_OutlineWidth,_OutlineWidth,_OutlineWidth,0));
  37. o.uv = v.uv;
  38. return o;
  39. }
  40. fixed4 _OutlineColor;
  41. fixed4 frag (v2f i) : SV_Target
  42. {
  43. // fixed4 col = tex2D(_MainTex, i.uv);
  44. fixed4 col = _OutlineColor;
  45. return col;
  46. }
  47. ENDCG
  48. }
  49. Pass
  50. {
  51. name "OuterFace"
  52. CGPROGRAM
  53. #pragma vertex vert
  54. #pragma fragment frag
  55. #include "UnityCG.cginc"
  56. struct appdata
  57. {
  58. float4 vertex : POSITION;
  59. float2 uv : TEXCOORD0;
  60. };
  61. struct v2f
  62. {
  63. float2 uv : TEXCOORD0;
  64. float4 vertex : SV_POSITION;
  65. };
  66. v2f vert (appdata v)
  67. {
  68. v2f o;
  69. o.vertex = UnityObjectToClipPos(v.vertex);
  70. o.uv = v.uv;
  71. return o;
  72. }
  73. sampler2D _MainTex;
  74. fixed4 frag (v2f i) : SV_Target
  75. {
  76. fixed4 col = tex2D(_MainTex, i.uv);
  77. return col;
  78. }
  79. ENDCG
  80. }
  81. }
  82. }
效果展示

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/107689
推荐阅读
相关标签
  

闽ICP备14008679号