_第一个被执行的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存放光源的第一种方式
_ Forward渲染路径_2_Forward渲染路径下的重要光源