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

6.2顶点照明和Unity存放光源的第一种方式
6.2.1用于调试输出的材质
    这里面有只含有一个Pass为LightMode=Vertex的材质。很简单, 都是为检测unity_LightPos_ 0在Pass的LightMode=Vertex时的存在状 态而设计的。
    其中unity_LightPosX0.x0的代码如下:
Shader "Tut/Lighting/VertexLit/Lab_1/unity_4LightAtten0.a0" {
	Properties {
		_Color ("Base Color", Color) =(1,1,1,1)
	}
	SubShader {
		pass{
		Tags{ "LightMode"="Vertex"}
		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)
		{
			vertOut o;
			o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
			o.color=unity_4LightAtten0[0];
			return o;
		}
		float4 frag(vertOut i):COLOR
		{
			return i.color;
		}
		ENDCG
		}//end pass
	}
}

       这个Shader只是将unity_4LightPosX0四元数的第一个分量作为颜色输出。同样地,unity_4LightPosY0.y0.shader输出的是对于当前物体而言,此时在unity_4LightPosY0中的第一个分量,这样,通过Shader的unity_LightPosX0.x0, unity_LightPosY0.y0和unity_4LightPosZ0.z0并且想办法设定灯光的位置处在(0 ,1)空间,我们就准确检测unity_4LightPos[X,Y,Z]0所传递的第一个灯光的位置或者方向信息。同样,我们也可以知道unity_4LightPos[X,Y,Z]0所传递的第2, 3. 4个灯光的信息。

untiy 3d ShaderLab_第6章_VertexLit渲染路径_2_顶点照明和Unity存放光源的第一种方式_第1张图片

6.2.2设计用于检测的场景
       unity_4LightAtten0.a0.shader检测了unity_4LightAttenO四元数中的第一个衰减信息。如图6.1 所示,右上角的3个球体分别被赋予了Lighting/DigitalColor文件夹下的DigitalColor.0.2.shader、 DigitalColor.0.5.shader和DigitalColor.0.9.shader 3个材质,这3个材质在任何情况下都分别输出和 它们名字一致的固定灰色,这里就是0.2、0.5和0.9。它的下面是场景里的黄、绿、红、蓝4个灯 光的世界坐标位置信息。而且这3个灯光的坐标xyz值都处于(0,1)空间,这样,我们通过一 组信号灯的颜色就足够准确地表达和检测数组中的灯光存在与否,如果存在,是哪一个灯光的信 息。再往下是一个被赋予Unity自带的默认材质的球体,可以帮助我们检测环境中灯光的变化信息。

untiy 3d ShaderLab_第6章_VertexLit渲染路径_2_顶点照明和Unity存放光源的第一种方式_第2张图片


    在标签(.X、.Y、.Z、.Atten)的右边,4排分别代表用灰度输出的unity_4LightPos[X,Y,Z]0 数组中的光源世界坐标位置或者方向向量以及对应的灯光衰减信息。绿色区域是一组控制面板, 左边是改变当前渲染相机的RenderingPath的3个控制按钮,可分别切换相机到VertexLit, Forward 和Deferred模式,而右边则是两个平行光和4个点光源的控制按钮,可以让我们在运行时改变灯 光是否启用,启用时的状态点——光源、行光、RenderMode为Pixel或者Vertex。
6.2.3 在Vertex Pass中的检测结果

        编译场景Lab 1为独立可执行文件并运行,如图6.2所示,得到的unity 4LightPos[X,Y,Z]0数组信息的指示材质全黑,这说明数组中的信息为0或负,但是无论如何,我们已经知道场景中存在的6个灯光信息都处于(0 , 1)空间内,而且如果有输出,应该用左上角所示的3个灰度色来表示。

untiy 3d ShaderLab_第6章_VertexLit渲染路径_2_顶点照明和Unity存放光源的第一种方式_第3张图片

    我们现在可以随意地切换Camera的RenderingPath,并改变光源的状态,但是在 LightMode = Vertex的Pass内,我们是无法得到光源数据的,或者说对于LightMode=Vertex的Pass Unity并未提供光源数据
6.2.4无效数据
    虽然Unity并未为LightMode=Vertex的Pass提供数据,但是Unity有个习惯,不会针对不同 的Pass及时清除无效的数据。我们可以利用这一点来得到残留的数据。
    打开同一个文件夹下的Lab lchaos场景,如图6.3所示,可以看到这个场景和刚刚的Lab_1 场景完全一样,除了一点,我们添加了一个被赋予默认材质的小球。这样做的意义在于现在我们 的场景中不单单只有LightMode为Vertex的Pass,在Forward渲染路径下还会有Pass会被运行。

untiy 3d ShaderLab_第6章_VertexLit渲染路径_2_顶点照明和Unity存放光源的第一种方式_第4张图片
    如图6.3所示,我们在unity 4LightPos[X,Y,Z]0中看到了数据, 而且如果是在Forward的渲染路径下,如果我们改变光源的状态,比如从Pixel光源变为Vertex 光源,即从点光源变为平行光,unity_4LightPos[X,Y,Z]0都会有相应的改变。但是不要误会, 这并不是Unity为Vertex的Pass中的unity_4LightPos[X,Y,Z]0提供的数据,而是最后一个Forward Pass渲染过后遗留的未及时清除的无效数据。
      所以结论就是,在LightMode = Vertex的Pass内,Unity没有提供数据到unity_LightPos[X,  Y} Z]0中

你可能感兴趣的:(3D,shaderlab,untiy)