untiy 3d ShaderLab_第5章_第一个被执行的Pass_2_3个渲染路径之外

第一个被执行的Pass

5.2 3个渲染路径之外

5.2.1 LightMode的其他值
除了传统的3个渲染路径之外,Pass的LightMode标签还允许被设为Always或者干脆不设置。当LightMode被设置为Always时,这个Pass是如何被执行的呢?是在材质中被选中的Pass之前还是之后?
5.2.2设计检测用的材质
    这里有几个用于测试这个问题的Shader,首先是Always.shader,
其LightMode=Always,用于输出一个绿色(0, 1, 0, 1)。其代码如下:
Shader "Tut/Lighting/FirstLight/Lab_1/Always" {

	SubShader {
		pass{
		Tags{ "LightMode"="Always"}
		Blend One One
		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(0,1,0,1);
			return o;
		}
		float4 frag(vertOut i):COLOR
		{
			return i.color;
		}
		ENDCG
		}//end pass
	}
}
    然后是Deferred_Always.1.shader,有一个针对Deferred渲染路径的Surface Shader,其次是一个Always Pass,其混合模式为Blend One Zero,也就是说,如果Always在Surface Shader之后执行,就会只显示自己输出的绿色,反之会输出一个混合之后的黄色。其代码如下:
Shader "Tut/Lighting/FirstLight/Lab_2/Deferred_Always.1" {
	Properties {
		_MainTex ("Base (RGB)", 2D) = "white" {}
	}
	SubShader {
		Tags { "RenderType"="Opaque" }
		Blend One One


		CGPROGRAM
		#pragma surface surf MyDeferred 
		half4 LightingMyDeferred_PrePass (SurfaceOutput s, half4 light) {
			 half4 c;
            c.rgb = s.Albedo;
            c.a = s.Alpha;
            return c;
		}


		struct Input {
			float2 uv_MainTex;
		};
		sampler2D _MainTex;
		void surf (Input IN, inout SurfaceOutput o) {
			o.Albedo=float3(1,0,0);
		}
		ENDCG


		pass{
		Tags{ "LightMode"="Always"}
		Blend One Zero
		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(0,1,0,1);
			return o;
		}
		float4 frag(vertOut i):COLOR
		{
			return i.color;
		}
		ENDCG
		}//end pass
	}
}
       还有Deferred_Always.2.shader,它和Deferred_Always.l.shader的不同之处在于Always的Pass在代码中被放置到了针对Deferred而写的Surface Shader之前。
       此外,同样还有Forward_Always.l.shader和Forward_Always.2.shader,Vertex_Always.l.shader和Vertexes_Always.2.shader,含有数字2的Shader,其中Always Pass都在代码中被相应地放置到了前面。
      所有的Always Pass都输出绿色并使用Blend One Zero的混合模式,其他Pass或者SurfaceShader则输出红色,并使用Blend One One的混合模式。
5.2.3  Always类型的Pass在3种渲染路径下的执行
       我们现在可以编译并运行看看了。先把Camera切换到VertexLit模式下,如图所示,在针对Deferred和Forward渲染路径设计的Shader中,因为不能在VertexLit模式下执行,所以Always Pass也没有被执行。而在针对VertexLit渲染路径的Shader中,Always Pass的执行和在代码中的位置有关系,在代码中靠前,则先执行,然后被混合模式为Blend One One的Vertex Pass中输出的红色混合,输出为黄色;在代码中靠后,则后执行,其混合模式为Blend One Zero,所以输出为绿色。
 
        再切换Camera到Forward模式下,结果如图所示。可以注意到,在Forward模式下,Always Pass也是按照在代码中的位置来执行。

     然后切换Camera到Deferred模式下,结果如图 所示。在Deferred模式h ,  Always Pass根本没有被执行,因此结果是Surface Shader输出的红色。

5.2.4  LightMode的默认值及其在3种渲染路径下的执行
    如果Pass内没有明确设置LightMode呢?
LightMode=Always时一样,此时的Pass会在VertexLit模式下和Vertex Pass一起按照在代码中的先后顺序执行。在Forward模式下也是根据代码中的先后顺序执行的。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值