Forward渲染路径学习笔记

  1. 渲染细节:
    • 根据影响物体的光源不同,正向渲染用单个或者多个通道来渲染物体;
    • 在正向渲染中光源本身也会根据他们的设置和强度受到不同的对待。
  2. 实现细节:
    • 在正向渲染中,影响物体最亮的几个光源使用逐像素光照模式(per-pixel lit mode)。
    • 接下来,最多有4个点光源会以逐顶点渲染方式被计算。
    • 其他光源将以球面跳河的方式进行计算。
    • 判断一个光源是否为逐像素光源的依据:
      • 渲染模式被设置为不重要的光源不用逐像素光照模式计算。
      • 最亮的方向光源per-pixel。Brightestdirectional light is always per-pixel.
      • 如果根据以上规则的到的像素光源数量小于Quality Setting中的Pixel Light Count,为了减少亮度,将会有更多的光源以逐像素的方式进行渲染。If the above results in less lights than current Pixel Light Count Quality Setting, then more lights are rendered per-pixel, in order of decreasing brightness.
  3.  渲染通道:ForwardBase和ForwardAdd是专门为在Forward渲染路径下渲染物体而设计的两种Pass。其中ForwardBase会优先于ForwardAdd渲染。
  4. 通道细节:       
    • ForwardBase:Base Pass applies one per-pixel directional light and all per-vertex/SH lights。ForwardBase通道渲染一个逐像素方向光和所有的顶点/球面调和光。此通道还负责渲染着色器中的光照贴图,环境光和自发光。在此通道中渲染的方向光可以产生阴影。
    • ForwardAdd:Other per-pixel lights are rendered in additional passes, one pass for each light。其他的像素广在附加通道中进行渲染,每个光源都需要一个通道。在这些通道中渲染的光源无法产生阴影。
    • 以上可知:前向渲染支持一个能产生阴影的方向光。so in result, Forward Rendering supports one directional light with shadows
  5. 下面是官方给出的对光源不同处理

假设光源A到H都有相同的颜色和强度,且它们的渲染模式都为自动的(Auto),那么它们严格的按照其名字排序。最亮的光源以逐像素光照模式的方式进行渲染(A到D),然后最多有4个光源以逐顶点光照模式进行渲染(D到G),其他光源以球面调和的方式进行渲染(G到H)


可知:由第四点通道细节,在ForwardBase中只渲染一个逐像素方向光A和所有球面调和光。即 A E F G H;其他光源在ForwardAdd中渲染。

官方强调球面调和光很快很高效。


自己的理解

ForwardAdd没必要和ForwardPass一起使用。毕竟不同的通道做了不同的事情。如果在场景中有多个光源的情况ForwardAdd也可以单独生效。比如下面的shader在场景中有多个光源的情况下可以输出鲜亮的大红。
Shader "Tut/Lighting/Forward/Lab_0/FwdAddX" {

	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
	}
}

重要光源在ForwardAdd内的执行:

  1. 在ForwardBase内只有场景中存在RenderMode为Important的pixel平行光时,_WorldSpaceLightPos0和_LightColor0的组合会生效。如果光源为点光源_WorldSpaceLightPos0是生效的_LightColor0不生效。生气


展开阅读全文

没有更多推荐了,返回首页