_第一个被执行的Pass_2_3个渲染路径之外

Posted heyuchang666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了_第一个被执行的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模式下也是根据代码中的先后顺序执行的。




以上是关于_第一个被执行的Pass_2_3个渲染路径之外的主要内容,如果未能解决你的问题,请参考以下文章

untiy 3d ShaderLab_第8章_3_ 单光贴图和Forward 渲染路径

_VertexLit渲染路径_2_顶点照明和Unity存放光源的第一种方式

_3_ 单光贴图和Forward 渲染路径

_ Forward渲染路径_2_Forward渲染路径下的重要光源

_VertexLit渲染路径_3_顶点照明和Unity存放光源的第二种方式

Unity渲染路径 Rendering Paths_3_Vertex Lit 顶点光照