您的位置:首页 > 移动开发 > Unity3D

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

2016-05-03 19:26 531 查看
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个灯光的信息。



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自带的默认材质的球体,可以帮助我们检测环境中灯光的变化信息。



在标签(.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个灰度色来表示。



我们现在可以随意地切换Camera的RenderingPath,并改变光源的状态,但是在LightMode = Vertex的Pass内,我们是无法得到光源数据的,或者说对于LightMode=Vertex的PassUnity并未提供光源数据。

6.2.4无效数据

虽然Unity并未为LightMode=Vertex的Pass提供数据,但是Unity有个习惯,不会针对不同的Pass及时清除无效的数据。我们可以利用这一点来得到残留的数据。

打开同一个文件夹下的Lab lchaos场景,如图6.3所示,可以看到这个场景和刚刚的Lab_1场景完全一样,除了一点,我们添加了一个被赋予默认材质的小球。这样做的意义在于现在我们的场景中不单单只有LightMode为Vertex的Pass,在Forward渲染路径下还会有Pass会被运行。



如图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提供的数据,而是最后一个ForwardPass渲染过后遗留的未及时清除的无效数据。

所以结论就是,在LightMode = Vertex的Pass内,Unity没有提供数据到unity_LightPos[X, Y} Z]0中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: