意义
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{
};
//顶点着色器->计算竖直方向进行高斯模糊的uv
v2fBlur 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 Always
Cull Off
ZWrite Off
Pass{
//提取亮部
CGPROGRAM
//声明顶点着色器和片元着色器
#pragma vertex vertExtractBright
#pragma fragment fragExtractBright
ENDCG
}
//竖直方向的高斯模糊
Pass{
CGPROGRAM
#pragma vertex vertBlurVertical
#pragma fragment fragBlur
ENDCG
}
Pass{
//水平方向的高斯模糊
CGPROGRAM
#pragma vertex vertBlurHorizontal
#pragma fragment fragBlur
ENDCG
}
Pass{
//模糊后的结果和之前线性减淡(叠加)
CGPROGRAM
#pragma vertex vertBloom
#pragma fragment fragBloom
ENDCG
}
}
FallBack Off
}