untiy 3d ShaderLab_第6章_VertexLit渲染路径_1_顶点照明

来源:互联网 发布:怎么自学java 编辑:程序博客网 时间:2024/04/30 05:00

    本章的主要目的是让读者能够正确地存取Unity为Vertex Pass设定的光源数据,从而定制自己为VertexLit渲染路径而写的Shader。如果读者没有这个需求,或者说己经了解了Unity是如何为VertexLit渲染路径存放光源数据的,那么就一可以跳过本章。
6.1顶点照明
6.1.1什么是顶点照明

    顾名思义,逐顶点计算的Vertex Light就是基于物体的每一个顶点进行光的照明计算,然后根据顶点的光照信息对面片土的像素光照进行线性插值,这个线性插值操作是通过GPU的硬件来完成的,速度不是一般的快,因此这部分的消耗可以不用考虑。所以Vertex Lighting的效果和效率与物体的网格密度有密切关系,网格细分大,计算结果就比较贴近实物,但是GPU计算消耗就也相应地增加。因此在IOS等GPU不是那么强大的移动设备上,这是一个很重要的光照计算模式。当然,不是说它在单机平台上不重要。Shader写得好,运用得当,游戏在单机平台上也会运行流畅且出彩。
    接下来的几章中,我们要讨论的主题是光照的计算,因此为了简化环境,在每一个场景中,可以打开Edit菜单下的Render Settings命令,将Ambient Light设置为全黑,使Fog处于关闭状态,以观察不同的Render Mode 和 Light Mode以及Rendering Path如何相互作用,而不用考虑不必要元素的干扰。
6.1.2存取光源的变量
    在Unity的ShaderLab编程环境中,目前已经知道的存取光源的变量有如下几个。
    (1) float4_WorldSpaceLightPos0矢量,和它相对应的是一个float4_LightColor0。根据名字可以知道,这是一个表示在世界坐标中的光源的位置矢量或者方向矢量。如果_WorldSpaceLightPos0.w为0,则表示这是一个平行光,_WorldSpaceLightPos0.xyz为此平行光的方向向量,反之则表示这是一个点光源,_WorIdSpaceLightPosO.xyz为此点光源在世界坐标中的位置。
    ( 2 ) float4  unity_4LightPosX0、float4  unity_4LightPosY0、float4 unity_4LightPosZ0,根据Unity的UnityCG cginc的说明,这3个四元数表示4个光源的xyz坐标,但是Unity没有直接告诉我们3个四元数表示的是什么样的光源,在UnityCG.cginc中的Shade4PointLights函数似乎暗示这是4个点光源。和它相对应的是float4  unity_4LightAtten0,表示的是这4个光源的衰减,float4unity_LightColor[4]是对应光源的颜色。
    ( 3 ) float4  unity_ LightPosition[4],表示4个点光源的光源位置或者平行光的方向矢量。如果unity_LightPosition[index].w为0,则表示这是一个平行光。和它对应的是float4 unity_LightColor[4]存储了光源的颜色:float4  unity_LightAtten[4],存储了光源的衰减。
    并不是在任何时候,任何一个上面提到的变量都包含了有效的数据,如何辨别这些数据,在什么时候使用哪一套变量,是本章和接下来几章将要讲述的内容。


1 0
原创粉丝点击