untiy 3d ShaderLab_第7章_ Forward渲染路径_3_重要光源在ForwardAdd内的执行

7.3重要光源在ForwardAdd内的执行

此外我们知道,根据Unity在关于Forward RenderingPath的官方帮助文档的陈述,除了第一个Pixel平行光之外,每个其他Pixel光源都会在个单独的ForwardAdd Pass内被执行,也就是说场景中的Pixel光源数为n,则ForwardAdd Pass会被执行n-1次。下面就来验证每一个其他Pixel光源是在ForwardAdd Pass内被执行的。

7.3.1设计用来检测Pixel光源的材质

Lab_1c文件夹下的场景,其编辑器截图如下图所示,左下角的小球被赋予一个默认材质,左边的大球使用的是_Indicator/ForwardBase文件夹下的_WorIdSapceLightPos0.shader,该Shader只计算了ForwardBase内的_WorldSapceLightPos0的光照效果。而右边的大球则使用了Lablc/Shader文件夹里的_WorIdSpaceLightPos0.shader,该Shader在ForwardBase内的输出为(0,0,
0,  1),保证了只会输出FowardAdd内的结果,而具体的ForwardAdd Pass则使用了Blend OneOne的混合模式,因此都是在上一个ForwardAdd的基础上叠加的效果。

下面是_Indicator/ForwardBase/_WorldSapceLightPos0.shader的代码:

Shader "Tut/Lighting/Forward/Indicator/Base/_WorldSpaceLighPos0" {
	Properties {//这个一个只计算了ForwardBase内的_WorldSpaceLightPos0光照的Shader
		_Color ("Base Color", Color) =(1,1,1,1)
	}
	SubShader {
		pass{
		Tags{ "LightMode"="ForwardBase"}
		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#pragma multi_compile_fwdbase
		#include "UnityCG.cginc"
		#include "Lighting.cginc"

		uniform float4 _Color;

		struct vertOut{
			float4 pos:SV_POSITION;
			float4 color:COLOR;
		};
		vertOut vert(appdata_base v)
		{
			float3 n=(mul(float4(v.normal,0.0),_World2Object)).xyz;
			n=normalize(n);

			float4 lightDir;
			float dist;
			float4 diffColor=float4(0,0,0,0);
			float diff=0;
			float atten=1;

			float4 worldSpaceVertex=mul(_Object2World,v.vertex);

			//first light 第一个重要光源
			float4 lightPos=_WorldSpaceLightPos0;
			if(lightPos.w==0)//direction 此条件可判断光源是否为平行光
			{
				lightDir=lightPos;
				atten=1.0;
			}else//Point/Spot 否则是点光源
			{
				lightDir=lightPos-worldSpaceVertex;
				atten=1/(1+length(lightDir));
				lightDir=normalize(lightDir);
			}

			diff=max(0.0,dot(n,lightDir.xyz));
			diffColor=_LightColor0*_Color*diff*atten;

			vertOut o;
			o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
			o.color=diffColor;
			return o;
		}
		float4 frag(vertOut i):COLOR
		{
			return i.color;
		}
		ENDCG
		}//end pass
	}
}

下面是Lab_1c/_Shader文件夹里_WorldSpaceLightPos0.shader的代码:

Shader "Tut/Lighting/Forward/Lab_1c/_WorldSpaceLighPos0" {

	Properties {
		_Color ("Base Color", Color) =(1,1,1,1)
	}
	SubShader {
		pass{
		Tags{ "LightMode"="ForwardBase"}
		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#pragma multi_compile_fwdbase
		#include "UnityCG.cginc"
		#include "Lighting.cginc"

		uniform float4 _Color;

		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,0,1);//通过输出黑色,去掉ForwardBase的影响
			return o;
		}
		float4 frag(vertOut i):COLOR
		{
			return i.color;
		}
		ENDCG
		}//end pass
		pass{//这个ForwardAdd内的光源才是我们需要检测的
		Tags{ "LightMode"="ForwardAdd"}
		Blend One One
		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#include "UnityCG.cginc"
		#include "Lighting.cginc"

		uniform float4 _Color;

		struct vertOut{
			float4 pos:SV_POSITION;
			float4 color:COLOR;
		};
		vertOut vert(appdata_base v)
		{
			float3 n=(mul(float4(v.normal,0.0),_World2Object)).xyz;
			n=normalize(n);

			float4 lightDir;
			float dist;
			float4 diffColor=float4(0,0,0,0);
			float diff=0;
			float atten=1;

			float4 worldSpaceVertex=mul(_Object2World,v.vertex);

			//first light 第一个重要光源
			float4 lightPos=_WorldSpaceLightPos0;
			if(lightPos.w==0)//direction 此条件可判断光源是否为平行光
			{
				lightDir=lightPos;
				atten=1.0;
			}else//Point/Spot  否则为点光源
			{
				lightDir=lightPos-worldSpaceVertex;
				atten=1/(1+length(lightDir));
				lightDir=normalize(lightDir);
			}

			diff=max(0.0,dot(n,lightDir.xyz));
			diffColor=_LightColor0*_Color*diff*atten;

			vertOut o;
			o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
			o.color=diffColor;
			return o;
		}
		float4 frag(vertOut i):COLOR
		{
			return i.color;
		}
		ENDCG
		}//end pass
	}
}

7.3.2设计检测用的场景

场景中存在一个足够强大的黄色Pixel平行光,强大到可以保证它一定会被ForwardBase内的_WorldSpaceLightPos0所捕捉,从而不会让任何其他Pixel光源落到ForwardBase内,而只会被放到ForwardAdd Pass的_WorIdSpaceLightPos0内。最后,场景中还有5个RenderMode为Not
Important,即Vertex光源,其色彩分别为青色、橙色、绿色、红色和蓝色。

7.3.3检测结果:ForwardAdd如何被执行

编译并运行此场景,然后依次将5个Vertex光源设为Pixel,结果如图7.8所示,右边的大球体依次被染上了青色、橙色、绿色、红色和蓝色(根据你的改变次序,顺序会稍有差异)。现在我可以负责任地告诉大家,针对这5个Pixel光源,模式为Blend One One的ForwardAdd Pass确确实实被执行了5次。

返回到上一个场景,即Lab_1下面的那个场景,把光源不停地在Pixel和Vertex模式,以及Point和Direction模式问切换,可以发现,对于将会被传递到ForwardAdd内的每一个Pixel光源,Unity也是按照强弱的顺序依次让它们在ForwardAdd Pass内执行的。

时间: 2024-11-01 04:56:10

untiy 3d ShaderLab_第7章_ Forward渲染路径_3_重要光源在ForwardAdd内的执行的相关文章

untiy 3d ShaderLab_第7章_ Forward渲染路径_1_ForwardBase和ForwardAdd

第7章 Forward渲染路径 本章的主要目的是让大家在不使用Unity的Surface Shader时,也能够正确地存取Unity的光源数据,从而定制自己的Forward渲染路径的Shader.如果读者没有这个需求,或者己经了解了Unity是如何为Forward渲染路径存放光源数据的,那么就可以跳过本章. 7.1ForwardBase和ForwardAdd ForwardBase和ForwardAdd是专门为在Forward渲染路径下渲染物体而设计的两种Pass,其中ForwardBase会先

untiy 3d ShaderLab_第7章_ Forward渲染路径_2_Forward渲染路径下的重要光源

第7章 Forward渲染路径 本章的主要目的是让大家在不使用Unity的Surface Shader时,也能够正确地存取Unity的光源数据,从而定制自己的Forward渲染路径的Shader.如果读者没有这个需求,或者己经了解了Unity是如何为Forward渲染路径存放光源数据的,那么就可以跳过本章. 7.2Forward渲染路径下的重要光源 7.2.1 设计检测用的材质 其编辑器截图如图所示, _WorldSpaceLightPosO.x.shader文件,其主要代码如下: Shader

untiy 3d ShaderLab_第7章_ Forward渲染路径_4_Forward渲染路径总结

Forward渲染路径总结 现在可以总结一卜适应于Forward渲染路径的ForwardBase和ForwardAdd的情况. 7.4.1   Forward渲染路径下材质的适应性 这两类Pass不能在Camera为VertexLit时被演染,但可以被渲染路径为Forward和Deferred的Camera渲染. 7.4.2  Unity如何为Forward渲染路径设置光源 在ForwardBase的Pass内,_WorldSpaceLightPos0和_LightColor0只会含有第一个Pi

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

8.3 单光贴图和Forward 渲染路径 8.3.1单光照贴图在VertexLit和Forward下面的不同表现 在单光照贴图的情况下,Camera的RenderingPath为VertexLit时,有一个不理想的地方就是被烘焙过的静态物体,默认的材质不会受到实时光照的影响.当然,可以通过提供自定义的材质改变这一行为,但是很麻烦.在RenderingPath为Forward时,这种麻烦就不会存在了,经过烘焙物体,Unity的默认材质会继续受到实时Pixel光源的影响. 8.3.2 准备可应用于

untiy 3d ShaderLab_第6章_VertexLit渲染路径_4_顶点照明和Unity存放光源的第三种方式

6.4顶点照明和Unity存放光源的第三种方式 6.4.1   Unity为Vertex Pass准备的光源 是不是绝望了?世界没有光明怎么能行呢?当然不行,光明马上就来,Unity把它放到了unity_LightPosition[4]数组中. 可以简单地告诉你一个结果:在LightMode = Vertex的Pass内,unity_LightPosition[4]和unity_LightColor[4]是存取光源数据最可靠的第一首选手段,无论在Camera的RenderingPath为何,Ve

[Unity Shader笔记]渲染路径--Forward渲染路径

[Unity Shader笔记]渲染路径--Forward渲染路径 (2014-04-22 20:08:25) 转载▼ 标签: shader unity renderingpath forward 游戏 分类: UnityShader *ForwardBase.ForwardAdd的LightMode只能运行在Came为Forward.DeferredLighting的渲染模式下 *ForwardAdd这个Pass需要和ForwardBase一起使用,否则会被Unity忽视掉 * Forward

渲染路径--Forward渲染路径

一渲染细节: 根据影响物体的光源不同,正向渲染用单个或者多个通道来渲染物体: 在正向渲染中光源本身也会根据他们的设置和强度受到不同的对待. 实现细节: 渲染通道:ForwardBase和ForwardAdd是专门为在Forward渲染路径下渲染物体而设计的两种Pass.其中ForwardBase会优先于ForwardAdd渲染. 在正向渲染中,影响物体最亮的几个光源使用逐像素光照模式(per-pixel lit mode). 接下来,最多有4个点光源会以逐顶点渲染方式被计算. 其他光源将以球面跳

ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区

原文:ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区 1 引言 1.1 读者定位 我们假设用户在阅读本指南前应已具备以下知识: · 熟悉Windows的基本操作 · 接触过地理信息系统的概念 · 理解地理数据的特点 1.2 预期效果 我们期望用户在阅读完本指南后对以下知识有一定的了解: · 了解ArcGIS for Desktop的组成与功能 · 熟悉使用ArcGIS for Desktop进行数据编辑.整饰和输出的流程 · 如何使用

ArcGIS for Desktop入门教程_第七章_使用ArcGIS进行空间分析 - ArcGIS知乎-新一代ArcGIS问答社区

原文:ArcGIS for Desktop入门教程_第七章_使用ArcGIS进行空间分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 使用ArcGIS进行空间分析 1.1 GIS分析基础 GIS的六大功能是数据获取.存储.查询.分析.表达.输出.在前面的内容里已经介绍了使用ArcGIS进行数据获取.存储.查询.表达和输出的过程,本章将介绍如何在ArcGIS中进行地理分析.分析是GIS的核心和灵魂,是GIS区别于一般的信息系统.CAD或者电子地图系统的主要标志之一. GIS分析,就是研究