[UnityShader]RenderingPath

Light组件:http://game.ceeger.com/Components/class-Light.html


Render Mode 渲染模式:这灯光的重要性。这可能会影响照明的保真度和性能,请参阅下面的性能注意事项。包括:

Auto 自动:为桌面构建目标渲染的方法是根据附近的灯光的亮度和当前的质量设置( Quality Settings)在运行时确定。

Important 重要:灯光是逐个像素渲染。只用在一些非常重要的效果(比如玩家的车的车头灯)。

Not Important 不重要:灯光总是以最快的速度渲染。顶点/对象光模式


性能考虑

灯光有两种渲染方式:顶点(vertex )光照和像素(pixel )光照。顶点光照只计算游戏模型的顶点照明和通过插值计算得出模型表面所有光线。灯光在屏幕每一个像素计算,因此很奢侈(耗费资源)。一些旧的显卡只支持顶点光照。


像素光照渲染得慢,但它能够实现一些顶点光照不能实现的效果。正规映射(Normal-mapping),灯光cookies(light cookies) 和实时阴影(realtime shadows)只能由像素光照渲染。

灯光有对渲染速度有非常大的影响——因此必须权衡前后照明质量和游戏速度。由于像素光照比顶点光照奢侈得多(更耗费资源),Unity将只在最亮的光逐个像素渲染。网页版(webplayer)和单机版(standalone)编译目标中,像素灯的实际数量可以质量设置( Quality Settings )进行设置。

光线以顶点光照或像素光照模式渲染。你可以通过渲染模式属性(Render Mode property)显式控制。默认情况下,Unity根据对象受到光影响的多少自动对光进行归类。

[UnityShader]RenderingPath_第1张图片


Camera组件:http://game.ceeger.com/Components/class-Camera.html


Rendering Path 渲染路径:定义什么绘制方法将被用于相机的选项。http://game.ceeger.com/Manual/RenderingPaths.html

Use Player Settings 使用玩家设置:在玩家设置(Player Settings.)相机使用哪个渲染路径。


Vertex Lit 顶点光照:所有被这个相机渲染的物体都将渲染成Vertex-Lit物体。

http://game.ceeger.com/Components/RenderTech-VertexLit.html


Forward 正向渲染:所有对象每材质渲染只渲染一次,和Unity 2.x中的标准一样。

http://game.ceeger.com/Components/RenderTech-ForwardRendering.html


Deferred Lighting 延迟照明:所有物体将在无光照的环境渲染一次,然后在渲染队列尾部将物体的光照一起渲染出来。

http://game.ceeger.com/Components/RenderTech-DeferredLighting.html

[UnityShader]RenderingPath_第2张图片


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


Rendering Path(渲染路径): Edit/Project Settings/Player/Other Settings/Rendering Path


Pixel Light(像素光):Edit/Project Settings/Quality

Unity中将平行光称作为像素光,第一个像素光是基础平行光,以LightMode=ForwardBase标签修饰,每多一个像素光都以LightMode=ForwardAdd标签修饰。并不是所有的光源在运行时都会反射到物体上,而是根据Project的Quality中设置的像素光数量来渲染的。
默认像素光的数量应该是2,我们有更多的平行光照在物体上,就需要在中去调节像素光的数量Pixel Light Count。
当场景中的实际像素光数量超过这个设定值的时候,unity只会渲染最重要的光。

像素光的叠加:Blend One One

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Shader:
当Rendering Path取值为:
1.Vertex Lit,显示红色
2.Forward,显示绿色
3.Deferred Lighting,显示蓝色
注意,由于使用了Blend One One,所以要确保摄像机背景色为黑色时,才可以看到上面的情况。每一个Pass除了LightMode和输出颜色不同外,其余相同。

Shader "Custom/Light" {
	Properties 
	{
	}
	SubShader 
	{
		Pass
		{
			Tags { "LightMode"="Vertex" }
			Blend One One

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.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
		}
		Pass
		{			
			Tags { "LightMode"="ForwardBase" }
			Blend One One

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.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
		}
		Pass
		{			
			Tags { "LightMode"="PrepassFinal" }
			Blend One One

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.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,1,1);
				return o;
			}
			float4 frag(vertOut i):COLOR
			{
				return i.color;
			}
			ENDCG
		}
	} 
	FallBack "Diffuse"
}

 总结:
1.在deferred渲染路径下,会找deferred为标签的pass,找到则执行。
2.如果找不到,会找forward为标签的pass,找到则执行。
3.如果再找不到,会找vertex为标签的pass,找到则执行。
4.在一个时间内只会执行一个渲染路径下的pass

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

当Tags { "LightMode"="Always" }时,
1.当Always为标签的pass是第一个pass时,无论是什么渲染路径,都会执行
2.当Always为标签的pass不是第一个pass时,只有当前面的pass(不包括deferred为标签的pass)执行成功,才会执行这个pass。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

光照模式标签(LightMode tag)

 

LightMode 标签定义了Shader的光照模式,具体含义以后会在讲渲染管线时讲到。下面我们先简单了解一下有哪些光照模式可选,以及他们的具体作用:

 

  • Always: 总是渲染。没有运用光照。
  • ForwardBase:用于正向渲染,环境光、方向光和顶点光等
  • ForwardAdd:用于正向渲染,用于设定附加的像素光,每个光照对应一个pass
  • PrepassBase:用于延迟光照,渲染法线/镜面光。
  • PrepassFinal:用于延迟光照,通过结合纹理,光照和自发光渲染最终颜色
  • Vertex: 用于顶点光照渲染,当物体没有光照映射时,应用所有的顶点光照
  • VertexLMRGBM:用于顶点光照渲染,当物体有光照映射的时候使用顶点光照渲染。在平台上光照映射是RGBM 编码
  • VertexLM:用于顶点光照渲染,当物体有光照映射的时候使用顶点光照渲染。在平台上光照映射是double-LDR 编码(移动平台,及老式台式CPU)
  • ShadowCaster: 使物体投射阴影。
  • ShadowCollector: 为正向渲染对象的路径,将对象的阴影收集到屏幕空间缓冲区中。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

你可能感兴趣的:(RenderingPath)