untiy 3d ShaderLab_第7章_ Forward渲染路径_1_ForwardBase和ForwardAdd

第7章 Forward渲染路径
    本章的主要目的是让大家在不使用Unity的Surface Shader时,也能够正确地存取Unity的光源数据,从而定制自己的Forward渲染路径的Shader。如果读者没有这个需求,或者己经了解了Unity是如何为Forward渲染路径存放光源数据的,那么就可以跳过本章。
  7.1ForwardBase和ForwardAdd
    ForwardBase和ForwardAdd是专门为在Forward渲染路径下渲染物体而设计的两种Pass,其 中ForwardBase会先于ForwardAdd被执行。这两种类型的Pass在Forward渲染路径下有着不同的 光照处理功能。在具体讲解Forward的Pass之前,我们首先来检查一下这两种不同的Forward Pass 在不同渲染路径下的表现。
7.1.1设计检测用的场景和材质

     打开Lab_0下的场景,如图所示。这场景里有3个RenderingPath,分别为VertexLit,Forward以及Deferred的相机,而且场景里有足够丰富的平行光、点光源、Pixel光源、Vertex光源。

     第一排小球应用的是Lab 0/ Shader下的材质FwdBase.shader,只是在LightMode= ForwardBase的Pass内输出一个(0, 0.5, 1.0, 1.0)的蓝色,第三排小球使用的是FwdAddX.shader,在LightMode = ForwardAdd的Pass内输出一个(1.0,0,0,1.0)的红色,第三排小球应用的是FwdAdd.shader,单单在LightMode = ForwardAdd的Pass内输出一个(1.0, 0.5, 0,1.0)的橘黄色。

untiy 3d ShaderLab_第7章_ Forward渲染路径_1_ForwardBase和ForwardAdd_第1张图片

    FwdBase.shader的主要代码如下:
Shader "Tut/Lighting/Forward/Lab_0/FwdBase" {
	SubShader {
		pass{//这个Pass只是被用来数出一个确定的颜色,用来检查这种类型的Pass在不同渲染路径下的表现
		Tags{ "LightMode"="ForwardBase"}
		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#pragma multi_compile_fwdbase
		#include "UnityCG.cginc"
		#include "Lighting.cginc"


		struct vertOut{
			float4 pos:SV_POSITION;
			float4 color:COLOR;
		};
		vertOut vert(appdata_base v)
		{
			vertOut o;
			o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
			o.color=float4(0,0.5,1,1);//输入固定的蓝色
			return o;
		}
		float4 frag(vertOut i):COLOR
		{
			return i.color;
		}
		ENDCG
		}//end pass
	}
}

    FwdAdd.shader的主要代码如下:
Shader "Tut/Lighting/Forward/Lab_0/FwdAdd" {


	SubShader {
		pass{
		Tags{ "LightMode"="ForwardBase"}
		CGPROGRAM
		#pragma multi_compile_fwdbase
		#pragma vertex vert
		#pragma fragment frag
		#include "UnityCG.cginc"
		#include "Lighting.cginc"


		struct vertOut{
			float4 pos:SV_POSITION;
			float4 color:COLOR;
		};
		vertOut vert(appdata_base v)
		{
			vertOut o;
			o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
			o.color=float4(0,0.5,1,1);//蓝色
			return o;
		}
		float4 frag(vertOut i):COLOR
		{
			return i.color;
		}
		ENDCG
		}//end pass
		pass{
		Tags{ "LightMode"="ForwardAdd"}
		Blend One Zero//通过这种混合方式消去ForwardBase的影响
		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#include "UnityCG.cginc"
		#include "Lighting.cginc"


		struct vertOut{
			float4 pos:SV_POSITION;
			float4 color:COLOR;
		};
		vertOut vert(appdata_base v)
		{
			vertOut o;
			o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
			o.color=float4(1,0.5,0,1);//输出固定的橘黄色
			return o;
		}
		float4 frag(vertOut i):COLOR
		{
			return i.color;
		}
		ENDCG
		}//end pass
	}
}
    FwdAddX.shader的主要代码如下:
SubShader {
		pass{
		Tags{ "LightMode"="ForwardAdd"}
		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		//#pragma multi_compile_fwdadd
		#include "UnityCG.cginc"
		#include "Lighting.cginc"


		struct vertOut{
			float4 pos:SV_POSITION;
			float4 color:COLOR;
		};
		vertOut vert(appdata_base v)
		{
			vertOut o;
			o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
			o.color=float4(1,0,0,1);//输出固定的红色
			return o;
		}
		float4 frag(vertOut i):COLOR
		{
			return i.color;
		}
		ENDCG
		}//end pass
	}
}
7.1.2  ForwardBase和ForwardAdd的表现
    我们编译运行一下,根据上面图中所示的结果,在VertexLit渲染模式下,  ForwardBase FowardAdd的LightMode都不被支持另外,FwdAddX.shader在3个渲染路径下都没有输出, 说明ForwardAdd这个Pass需要和ForwardBase一起使用,否则会被Unity所忽视掉。在Forward和Deferred渲染路径下,Forward的Pass均能被正常渲染

你可能感兴趣的:(untiy,3d,ShaderLab,untiy,ShaderLab学习之路)