_VertexLit渲染路径_1_顶点照明
Posted heyuchang666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了_VertexLit渲染路径_1_顶点照明相关的知识,希望对你有一定的参考价值。
本章的主要目的是让读者能够正确地存取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],存储了光源的衰减。
并不是在任何时候,任何一个上面提到的变量都包含了有效的数据,如何辨别这些数据,在什么时候使用哪一套变量,是本章和接下来几章将要讲述的内容。
以上是关于_VertexLit渲染路径_1_顶点照明的主要内容,如果未能解决你的问题,请参考以下文章
_VertexLit渲染路径_2_顶点照明和Unity存放光源的第一种方式
_VertexLit渲染路径_3_顶点照明和Unity存放光源的第二种方式