意义

unity会把 CGINCLUDE 和 ENDCG 之间的代码插入到每一个pass中,已达到声明一遍,多次使用的目的。(参考)例如,可以在 CGINCLUDE 和 ENDCG 之间 定义多个 顶点和片段方法,在pass里只要写明 #pragma vertex 顶点方法名 #pragma fragment 片段方法名 即可,而不用写具体的函数实现。
简言之:在多Pass的情况下,用CGINCLUDE内声明的变量、结构体、顶点着色器/片元着色器函数等,可以插入每个Pass,减少代码量(Pass内可以只用写声明和库)。

使用

CGINCLUDE 需要配合ENDCG关键字使用确定范围
例如,可以看到,4个Pass只需要声明定义,和导入头文件,设置渲染的操作,代码简洁易懂,我们又从CGINCLUDE中看到顶点着色器和片元着色器在每个Pass中的具体实现内容,大大提供了可阅读性。

  1. Shader "Unlit/MybloomEffect"
  2. {
  3. Properties
  4. {
  5. _MainTex ("Base (RGB)", 2D) = "white" {}
  6. //和原图外额再叠加后的纹理
  7. _Bloom ("Bloom (RGB)", 2D) = "black" {}
  8. //阈值
  9. _LuminanceThreshold ("Luminance Threshold", Float) = 0.5
  10. //模糊范围
  11. _BlurSize ("Blur Size", Float) = 1.0
  12. }
  13. SubShader
  14. {
  15. CGINCLUDE
  16. //在cgclude中写变量和结构体定义,可以不用在每个pass中再额外写
  17. #include"UnityCG.cginc"
  18. //在CG中声明属性,部分和Properties一致,导入库
  19. sampler2D _MainTex;
  20. half4 _MainTex_TexelSize;
  21. sampler2D _Bloom;
  22. float _LuminanceThreshold;
  23. float _BlurSize;
  24. //########第1个pass使用########
  25. //顶点数据结构体
  26. struct v2fExtractBright {
  27. float4 pos : SV_POSITION;
  28. half2 uv : TEXCOORD0;
  29. };
  30. //实现顶点数据矩阵
  31. v2fExtractBright vertExtractBright(appdata_img v) {
  32. }
  33. //片元着色器->提取高亮区域
  34. fixed4 fragExtractBright(v2fExtractBright i) : SV_Target {
  35. }
  36. //########第2、3个pass使用########
  37. struct v2fBlur{
  38. };
  39. //顶点着色器->计算竖直方向进行高斯模糊的uv
  40. v2fBlur vertBlurVertical(appdata_img v) {
  41. }
  42. //顶点着色器->同理水平方向模糊亦如此
  43. v2fBlur vertBlurHorizontal(appdata_img v){
  44. v2fBlur o;
  45. o.pos = UnityObjectToClipPos(v.vertex);
  46. half2 uv = v.texcoord;
  47. return o;
  48. }
  49. fixed4 fragBlur(v2fBlur i) : SV_Target{
  50. }
  51. return fixed4(sum,1.0);// 返回模糊后的结果
  52. }
  53. //########第4个pass使用########
  54. struct v2fBloom{
  55. };
  56. v2fBloom vertBloom(appdata_img v ){
  57. }
  58. //片元着色器->混合线性叠加add模糊图和原图
  59. fixed4 fragBloom(v2fBloom i):SV_TARGET{
  60. return tex2D(_MainTex, i.uv.xy)+tex2D(_Bloom, i.uv.zw);
  61. }
  62. ENDCG
  63. // 开启深度测试,关闭剔除和深度写入
  64. ZTest Always
  65. Cull Off
  66. ZWrite Off
  67. Pass{
  68. //提取亮部
  69. CGPROGRAM
  70. //声明顶点着色器和片元着色器
  71. #pragma vertex vertExtractBright
  72. #pragma fragment fragExtractBright
  73. ENDCG
  74. }
  75. //竖直方向的高斯模糊
  76. Pass{
  77. CGPROGRAM
  78. #pragma vertex vertBlurVertical
  79. #pragma fragment fragBlur
  80. ENDCG
  81. }
  82. Pass{
  83. //水平方向的高斯模糊
  84. CGPROGRAM
  85. #pragma vertex vertBlurHorizontal
  86. #pragma fragment fragBlur
  87. ENDCG
  88. }
  89. Pass{
  90. //模糊后的结果和之前线性减淡(叠加)
  91. CGPROGRAM
  92. #pragma vertex vertBloom
  93. #pragma fragment fragBloom
  94. ENDCG
  95. }
  96. }
  97. FallBack Off
  98. }