untiy 3d ShaderLab_第6章_VertexLit渲染路径_2_顶点照明和Unity存放光源的第一种方式
来源:互联网 发布:判断平年和闰年的java 编辑:程序博客网 时间:2024/06/03 02:18
6.2顶点照明和Unity存放光源的第一种方式
6.2.1用于调试输出的材质
这里面有只含有一个Pass为LightMode=Vertex的材质。很简单,都是为检测unity_LightPos_ 0在Pass的LightMode=Vertex时的存在状态而设计的。
其中unity_LightPosX0.x0的代码如下:
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中的检测结果
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中。
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个灯光的信息。
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个灰度色来表示。
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中。
1 0
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_2_顶点照明和Unity存放光源的第一种方式
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_3_顶点照明和Unity存放光源的第二种方式
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_4_顶点照明和Unity存放光源的第三种方式
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_4_顶点照明和Unity存放光源的第三种方式
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_1_顶点照明
- untiy 3d ShaderLab_第7章_ Forward渲染路径_2_Forward渲染路径下的重要光源
- untiy 3d ShaderLab_第7章_ Forward渲染路径_3_重要光源在ForwardAdd内的执行
- untiy 3d ShaderLab_第7章_ Forward渲染路径_1_ForwardBase和ForwardAdd
- untiy 3d ShaderLab_第8章_3_ 单光贴图和Forward 渲染路径
- untiy 3d ShaderLab_第8章_2_在效果和性能间进行权衡
- untiy 3d ShaderLab_第9章_2_球体阴影(二) 阴影的淡入/淡出
- untiy 3d ShaderLab_第7章_ Forward渲染路径_4_Forward渲染路径总结
- untiy 3d ShaderLab_第8章_ 基于光照贴图的烘焙照明
- untiy 3d ShaderLab_第8章_ 基于光照贴图的烘焙照明
- untiy 3d ShaderLab_第5章_第一个被执行的Pass_2_3个渲染路径之外
- untiy 3d ShaderLab_第8章_4_ 单光照贴图在Deferred 渲染路径下的实时阴影
- untiy 3d ShaderLab_第9章_2_球体阴影(一) 平行光对球体的投影
- untiy 3d ShaderLab_第9章_1_平面阴影(二) 点光源对平面的投影
- android Json解析——揭开json解析的神秘面纱
- Neural Network, IDE
- phantomjs#3系统模块
- OpenStack Austin Nova Design Summit - Migration
- 一个adapter实现多个itemView
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_2_顶点照明和Unity存放光源的第一种方式
- java-计算几何图形的面积(抽象类)
- 关于对JSR标准的理解
- 学校自己挂的题目。。。我也不知道是哪里的。。。
- bash :- : no such file or directory
- 第十周项目一 阅读下面的定义,请说出在测试函数中不同情况的调用产生的结果(5 e)
- Problem E
- Linux下调试与性能分析工具的总结
- Server进程和Client进程获取ServiceManager的远程接口