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],存储了光源的衰减。
并不是在任何时候,任何一个上面提到的变量都包含了有效的数据,如何辨别这些数据,在什么时候使用哪一套变量,是本章和接下来几章将要讲述的内容。
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
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_1_顶点照明
- 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_第7章_ Forward渲染路径_4_Forward渲染路径总结
- untiy 3d ShaderLab_第7章_ Forward渲染路径_1_ForwardBase和ForwardAdd
- untiy 3d ShaderLab_第8章_3_ 单光贴图和Forward 渲染路径
- untiy 3d ShaderLab_第7章_ Forward渲染路径_2_Forward渲染路径下的重要光源
- untiy 3d ShaderLab_第9章_1_平面阴影(一)
- untiy 3d ShaderLab_第8章_ 基于光照贴图的烘焙照明
- untiy 3d ShaderLab_第8章_ 基于光照贴图的烘焙照明
- untiy 3d ShaderLab_第5章_第一个被执行的Pass_2_3个渲染路径之外
- untiy 3d ShaderLab_第7章_ Forward渲染路径_3_重要光源在ForwardAdd内的执行
- untiy 3d ShaderLab_第8章_4_ 单光照贴图在Deferred 渲染路径下的实时阴影
- untiy 3d ShaderLab_第9章_1_平面阴影(二) 点光源对平面的投影
- untiy 3d ShaderLab_第9章_1_平面阴影(三) 点光源对平面的投影
- untiy 3d ShaderLab_第3章_Shader(着色器)中用到的各种空间概念
- Android Loader详解
- Android5.0查看应用使用情况的权限
- 虚幻4 String2Asset String2Class String2Object
- 2015 Objective-C 三大新特性
- 【Linux学习笔记六】进程管理
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_1_顶点照明
- BZOJ 2005([Noi2010]能量采集-数论)
- Elisp 入门笔记(1)
- swift 懒加载
- java网络socket编程
- 分布式系统_进程间通信_dubbo使用入门
- lexical_cast
- GDOI2016再次滚粗记
- GDOI2016旅行记