意义
unity会把 CGINCLUDE 和 ENDCG 之间的代码插入到每一个pass中,已达到声明一遍,多次使用的目的。(参考)例如,可以在 CGINCLUDE 和 ENDCG 之间 定义多个 顶点和片段方法,在pass里只要写明 #pragma vertex 顶点方法名 #pragma fragment 片段方法名 即可,而不用写具体的函数实现。
简言之:在多Pass的情况下,用CGINCLUDE内声明的变量、结构体、顶点着色器/片元着色器函数等,可以插入每个Pass,减少代码量(Pass内可以只用写声明和库)。
使用
CGINCLUDE 需要配合ENDCG关键字使用确定范围
例如,可以看到,4个Pass只需要声明定义,和导入头文件,设置渲染的操作,代码简洁易懂,我们又从CGINCLUDE中看到顶点着色器和片元着色器在每个Pass中的具体实现内容,大大提供了可阅读性。
Shader "Unlit/MybloomEffect"{Properties{_MainTex ("Base (RGB)", 2D) = "white" {}//和原图外额再叠加后的纹理_Bloom ("Bloom (RGB)", 2D) = "black" {}//阈值_LuminanceThreshold ("Luminance Threshold", Float) = 0.5//模糊范围_BlurSize ("Blur Size", Float) = 1.0}SubShader{CGINCLUDE//在cgclude中写变量和结构体定义,可以不用在每个pass中再额外写#include"UnityCG.cginc"//在CG中声明属性,部分和Properties一致,导入库sampler2D _MainTex;half4 _MainTex_TexelSize;sampler2D _Bloom;float _LuminanceThreshold;float _BlurSize;//########第1个pass使用########//顶点数据结构体struct v2fExtractBright {float4 pos : SV_POSITION;half2 uv : TEXCOORD0;};//实现顶点数据矩阵v2fExtractBright vertExtractBright(appdata_img v) {}//片元着色器->提取高亮区域fixed4 fragExtractBright(v2fExtractBright i) : SV_Target {}//########第2、3个pass使用########struct v2fBlur{};//顶点着色器->计算竖直方向进行高斯模糊的uvv2fBlur vertBlurVertical(appdata_img v) {}//顶点着色器->同理水平方向模糊亦如此v2fBlur vertBlurHorizontal(appdata_img v){v2fBlur o;o.pos = UnityObjectToClipPos(v.vertex);half2 uv = v.texcoord;return o;}fixed4 fragBlur(v2fBlur i) : SV_Target{}return fixed4(sum,1.0);// 返回模糊后的结果}//########第4个pass使用########struct v2fBloom{};v2fBloom vertBloom(appdata_img v ){}//片元着色器->混合线性叠加add模糊图和原图fixed4 fragBloom(v2fBloom i):SV_TARGET{return tex2D(_MainTex, i.uv.xy)+tex2D(_Bloom, i.uv.zw);}ENDCG// 开启深度测试,关闭剔除和深度写入ZTest AlwaysCull OffZWrite OffPass{//提取亮部CGPROGRAM//声明顶点着色器和片元着色器#pragma vertex vertExtractBright#pragma fragment fragExtractBrightENDCG}//竖直方向的高斯模糊Pass{CGPROGRAM#pragma vertex vertBlurVertical#pragma fragment fragBlurENDCG}Pass{//水平方向的高斯模糊CGPROGRAM#pragma vertex vertBlurHorizontal#pragma fragment fragBlurENDCG}Pass{//模糊后的结果和之前线性减淡(叠加)CGPROGRAM#pragma vertex vertBloom#pragma fragment fragBloomENDCG}}FallBack Off}
