CGINCLUDE 关键字的作用

在shader代码里经常会看到有这个关键字:CGINCLUDE,不注意的话很可能会和 CGPROGRAM 搞混淆,虽然这两个关键字都需要 ENDCG 来结束生效范围。在 CGINCLUDE 和 ENDCG 范围内可以插入一些shader代码,比如变量声明,结构体定义,函数实现等,如下:

CGINCLUDE
sampler2D _MainTex;
struct vertex_data
{
    float4 vertex : POSITION;
    float4texcoord : TEXCOORD0;
};

float4 frag(v2f i) : COLOR
{
    float4color;
    color =tex2D(_MainTex, i.uv);
    returncolor;
}
ENDCG

unity会把 CGINCLUDE 和 ENDCG 之间的代码插入到每一个pass中,已达到声明一遍,多次使用的目的。(参考)例如,可以在 CGINCLUDE 和 ENDCG 之间 定义多个 顶点和片段方法,在pass里只要写明 #pragma vertex 顶点方法名 #pragma fragment 片段方法名 即可,而不用写具体的函数实现。如下:

pass
{
	Tags{"Queue"="Geometry"}
	ZWrite On
	ZTest LEqual
	Cull Back
	
	CGPROGRAM
	#include"UnityCG.cginc"
	#pragmavertex vert
	#pragmafragment frag
	ENDCG
	}
	
	pass
	{
	Tags{"Queue"="Transparent"}
	ZWrite Off
	blend srcalpha oneminussrcalpha
	
	CGPROGRAM
	#pragmavertex vert2
	#pragmafragment frag2
	ENDCG
}

在第一个pass中使用 vert 和 frag 方法,在第二个pass中使用 vert2 和 frag2 方法。
完整shader如下:

Shader"MJ/Test"
{
	Properties
	{
		_MainTex("Main Texture", 2D) ="white"
	}

	CGINCLUDE
	sampler2D_MainTex;
	structvertex_data
	{
		float4 vertex : POSITION;
		float4 texcoord : TEXCOORD0;
	};
	
	structv2f
	{
		float4 position : SV_POSITION;
		float2 uv : TEXCOORD0;
	};
	
	v2f vert1(vertex_data v)
	{
		v2f o;
		o.position =mul(UNITY_MATRIX_MVP, v.vertex);
		o.uv = v.texcoord;
		returno;
	}
	
	v2f vert2(vertex_data v)
	{
		v2f o;
		o.position =mul(UNITY_MATRIX_MVP, v.vertex);
		o.uv = v.texcoord;
		returno;
	}
	
	float4 frag1(v2f i) : COLOR
	{
		return float4(1,0,0,1);
	}
	
	float4 frag2(v2f i) : COLOR
	{
		return float4(0,1,0,1);
	}
	ENDCG
		
	Subshader
	{
		pass
		{
			Tags{"Queue"="Transparent"}
			
			CGPROGRAM
			#include"UnityCG.cginc"
			#pragmavertex vert1
			#pragmafragment frag1
			ENDCG
		}
		
		pass
		{
			Tags{"Queue"="Transparent"}
			blend srcalpha oneminussrcalpha
			
			CGPROGRAM
			#pragmavertex vert2
			#pragmafragment frag2
			ENDCG
		}
	}
}
参考链接:
https://forum.unity.com/threads/what-is-the-command-of-cginclude.279175/

猜你喜欢

转载自blog.csdn.net/h5502637/article/details/84945261